【JAVA书单】-《JAVA多线程核心技术》-第二章 对象及变量的并发访问

此文是对《JAVA多线程编程核心技术》的一点总结,如果想要了解具体细节可以去看原书。

第二章 对象及变量的并发访问

  • synchronized对象监视器为Object时的使用
    a)、synchorized修饰非静态方法时,synchorinzed获得的锁都是对象锁,而不是把一段代码或方法当作锁,哪个线程先执行synchronized方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。如果多个线程访问多个对象,则JVM会创建多个锁。
    b)、A线程先持有object对象的Lock锁时,B线程可以以异步的方式调用object对象中的非synchronized类型的方法,但是如果调用synchronized类型的方法则需等待A线程释放object对象的Lock锁。
    c)、当一个线程执行的代码出现异常时,其所持有的锁会自动释放。
    d)、同步不具有继承性
    e)、synchronized拥有锁重入功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求改对象锁时是可以再次得到该对象锁的,也就是说一个synchronized方法内部可以调用本类其他synchronized方法,这是为了防止死锁。

    将任意对象作为对象监视器
    java支持对“任意对象”作为“对象监视器”来实现同步的功能。这个“任意对象”大多数是实例变量及方法的参数,使用格式为synchronized(非this)对象。锁非this对象具有一定的优势:如果一个类中有很多个synchronized方法,这时虽然可以同步,但是受到阻塞,影响运行效率。如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序与同步方法时异步的,不与其他锁this同步方法争抢this锁,大大提高运行效率。

    synchronized(非this对象)格式的作用只有1种:synchronized(非this对象)同步代码块:

    在多个线程持有“对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象)同步代码块中的代码。
    当持有“对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象)同步代码块中的代码

  • synchronized对象监视器为Class时的使用
    Class锁可以对类的所有对象实例起作用。

synchronized关键字加到static静态方法上是给Class类上锁,而synchronized关键字加到非static静态方法上是给对象上锁。

  • synchronized锁重入

    关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的。这也证明在一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的。

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

  • 数据类型String的常量特性

    在JVM中具有String常量池缓存的功能,同步synchronized代码块中使用String作为锁对象时,两个string锁对象有可能是同一个锁对象。在大多数的情况下,同步synchronized代码块都不使用String作为锁对象,而改用其他,比如new Object()实例化一个Object对象,但它并不放入缓存中,这样就是两个不同的锁对象。

  • 关键字volatile的主要作用
    关键字volatile的主要作用是使变量在多个线程间可见。
    线程工作时的内存结构如下:
    【JAVA书单】-《JAVA多线程核心技术》-第二章 对象及变量的并发访问
    通过使用volatile关键字,强制的从公共内存中读取变量的值。内存结构如下:
    【JAVA书单】-《JAVA多线程核心技术》-第二章 对象及变量的并发访问

  • 关键字volatile与synchronized的区别及使用情况
    1)关键字volatile性能比synchronized要好,并且volatile只能修饰变量,而sy可以修饰方法,以及代码块。在开发中使用synchronized的比率较大。
    2)多线程访问volatile不会发现阻塞,而synchronized会出现阻塞。
    3)volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性。
    4)volatile解决的是变量在多个线程之间的可见性,而synchronized解决的是多个线程之间访问资源的同步性。