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