Java的类对象锁 synchronized(xxx.class)

Java的类对象锁 synchronized(xxx.class) 从字面上讲,只锁住了类对象,就是在方法区中表示这个类的元数据信息的类对象。通过实验验证,也确实如此。用的是sun 的jdk 1.6.24。

 

测试类:Test.java   TestClassMethod.java  TestObjMethod.java

在测试类中有2个方法,一个类方法,一个实例方法。

TestClassMethod.java  TestObjMethod.java 两个类实现了Runnable接口,分别在run方法中调用类方法和实例方法。 TestClassMethod.java在调用类方法时使用了synchronized把Test.class锁住。

但是在TestObjMethod中仍然能对实例方法进行访问。

 

刚开始,将测试类的实例化对象作为类的静态属性,怕锁住类对象后,其他线程不能完成Test的实例化工作,但这个担心是多余了,在TestObjMethod的run方法中循环构造 Test的对象,都是没有问题的。

再测试对Test中类属性(静态属性)的访问,同样也是没问题的。在Test的 实例方法中访问Test的类属性,在一个线程把Test类对象锁住后,另一个调用实例方法的线程同样能访问到类属性。

 

再测试在实例方法中调用类方法,结果当另一个线程将类对象锁住后,类方法就不能被其他线程访问了。

 

所以,synchronized(xxx.class)只能锁住类的方法,类的属性、元数据等都是没有被锁住的,可以被其他线程访问。

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