多线程之并发访问

    1. “非线程安全”问题存在于"实例变量"中,方法内的变量为线程安全。

    2.   关键字synchronized 取得的锁都是对象锁。

    3.   如果多个线程访问多个对象,则JVM会创建多个锁。

    4.    A线程先持有object对象的Lock锁,B线程可以异步的方式调用object对象中的非synchronized类型的方法。

    5.     A线程先持有object对象的Lock锁,B线程如果在这时候调用object对象中的synchronized类型的方法,则需要同步。

    6.    synchronized锁重入:在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的。这也说明,在一个synchronized方法\块的内部调用本类的其他synchronized方法\块时,是永远可以得到锁的。

    7.    可重入锁也支持在父子类继承的环境中。

    8.    当存在父子类继承关系时,子类是完全可以通过"可重入锁"调用父类的同步方法的。

    9.    当出现异常时,锁自动释放。

    10.    同步不具有继承性。

    11.    synchronized同步语句块:synchronized 同步方法在某些情况下有弊端,在这种情况下,可以使用synchronized同步语句块来解决。

    12.     synchronized(this) 使用的"对象监视器"是一个。

    13.    synchronized还可以用在static静态方法上,那是对*.java对应的Class类进行加锁。

    14.    String 常量池

    15.    synchronized代码块通常情况下不适用String作为锁对象,因为String常量池带来的问题。

    16.    volatile:主要作用是使变量在多个线程间可见。它强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。

    17.    volatile变量不支持原子性。

    18.     synchronized vs volatile

  • volatile是线程同步的轻量级实现,所以性能优于synchronized,并且volatile只能适用于修饰变量,而synchronized可以修饰方法,代码块。
  • 多线程访问volatile不会发生阻塞,而synchronized会发生阻塞。
  • volatile能保证数据的可见性,但不能保证原子性;synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。
  • volatile解决的是变量在多个线程中的可见性,而synchronized解决的是多线程之间资源的同步性。

    19.    变量在内存中工作过程:

    

        read和load阶段:从主存复制变量到当前线程工作内存;

        use和asign阶段:执行代码,改变共享变量值;

        store和write阶段:用工作内存数据刷新主对应变量的值;

    20.    AtomicInteger, AtomicLong   原子类。但是原子类在具有逻辑的情况下输出结果也具有随机性。

    21.    synchronized 代码块具有volatile同步的功能,synchronized可以使具有可视性

猜你喜欢

转载自my.oschina.net/u/2319418/blog/1615056