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)只能鎖住類的方法,類的屬性、元數據等都是沒有被鎖住的,可以被其他線程訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章