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)只能锁住类的方法,类的属性、元数据等都是没有被锁住的,可以被其他线程访问。
测试类: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 Synchronized 关键字锁实例和锁CLASS对象的区别
- java synchronized 关键字(3)对象监视器Object与class同时使用
- java-测试synchronized使用xxx.class和this使用的区别
- JAVA Synchronized 关键字锁实例和锁CLASS对象的区别
- java synchronized 关键字(2)对象监视器为class
- Java线程同步:synchronized锁住的是代码还是对象
- java.lang.UnsupportedClassVersionError: org/xwiki/xxx : Unsupported major.minor version 51.0
- java 中 synchronized (class) 是什么意思
- Java获取泛型的Class对象
- Java:创建Class对象的三种方式/
- 【Java】使用synchronized和Lock对象获取对象锁
- Java线程同步:synchronized锁住的是代码还是对象
- java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX
- java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象
- mm_.java.lang.ClassNotFoundException: com.xxx.master.web.RequestLogListener
- Java多线程总结(二):理解对象锁 & synchronized和Lock的区别
- 思维导图学Java之Class对象
- java.io.FileNotFoundException class path resource [xxx.xml] cannot be opened
- Java线程同步:synchronized锁住的是代码还是对象
- 从头认识java-12.2 Class对象(1)-简介