多线程之并发访问

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

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

    3.   若是多个线程访问多个对象,则JVM会建立多个锁。多线程

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

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

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

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

    8.    当存在父子类继承关系时,子类是彻底能够经过"可重入锁"调用父类的同步方法的。.net

    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可使具备可视性

相关文章
相关标签/搜索