您的位置:首页 > 编程语言 > Java开发

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

2013-07-19 19:03 176 查看
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)只能锁住类的方法,类的属性、元数据等都是没有被锁住的,可以被其他线程访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: