2013-08-01 108 views
0

我正在通過this link。據此:「Class」類對象鎖定實現同步

類鎖實際上是作爲對象鎖實現的。當JVM加載一個類文件時,它創建一個類java.lang.Class的實例。當你鎖定一個類時,你實際上鎖定了該類的Class對象。

但是根據Java規範,堆上相同類型(類)的所有對象共享單個Class對象。 那麼對於多線程同步訪問Objects的情況如何呢?

回答

2

類鎖

synchronized (String.class) {...} 

的對象鎖定

//doesn't matter what the lock object is as long as it's not null 
private final Object lock = new Object(); 
... 
synchronized (lock) {...} // will throw NPE if lock is null 

他們都認爲object鎖,因爲String.class返回Class<String>一個實例。

在類鎖中,線程獲取實例監視器Class<String>。在對象鎖中,線程獲取實例監視器String

+1

@assylias你是對的。我想表明,對象是什麼並不重要,但不想與「對象」這個詞混淆。 –

1

但是根據Java規範,堆中相同類型(類)的所有對象共享單個Class對象。那麼對於多線程同步訪問對象,這怎麼可能呢?

只有同步靜態方法將需要線程獲取對象的鎖。所有同步的實例方法都需要相關的實例對象的鎖,它不共享。

1

但是根據java規範,堆 上的所有同類型(類)的對象共享單個Class對象。那麼對於多線程 同步訪問對象,這怎麼可能是真的?

類級鎖在靜態方法中更有意義。如果在靜態方法上使用synchronized關鍵字,則其監視器用於鎖定的對象是類對象,即由文字Class.class表示的對象。