JAVA对象锁与类锁

1、被syncronized修饰的方法,是对类的对象加锁,也就是说,当对象访问该方法时,当前的对象会被加锁,同一时刻同一对象不能再访问该方法,或者该对象的其他被syncronized修饰的方法。不同对象,同一时刻可以访问同一个syncronized方法或其他syncronized方法,两个对象之间并不产生互斥关系。

2、被static、syncronized修饰的方法,是对类进行加锁,也就是说,同一时刻只有一个类能访问该方法。对象锁与类锁不会产生互斥关系。

如,Test 类有如下2个成员方法,被syncronized所修饰,

syncronized void funA(){...}
syncronized void funB(){...}

另有一个被syncronized所修饰的静态方法,

<strong>static</strong> syncronized funC(){...}


Test 类的两个实例,
ta
tb ,则
ta
tb 分别同时拥有funA()、funB()成员方法。

那么上面一段话可以解释如下:

1、在同一时刻,当ta对象去访问funA()方法时,ta对象就被锁定了,这时候ta是不能再去访问funB()方法了;直到ta访问funA()方法结束并对ta的锁释放后,ta才能继续访问funB()方法。

2、当ta对象去访问funA()方法时,此时ta对象被锁定了;假如同一时刻tb对象也想去访问funA()方法,是能成功访问的,此时tb对象被锁定了。因为tatb是两个不同的对象,各自都拥有funA()、funB()方法,对两个对象分别加锁,并不会产生互斥关系。

3、当ta / tb访问funX()方法时,假如此时想访问Test类的funC()方法,是能访问成功的。这也就是对象锁与类锁并不会产生互斥的关系。

    原文作者:java锁
    原文地址: https://blog.csdn.net/guguituzi/article/details/41220069
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞