我正在通過this link。據此:「Class」類對象鎖定實現同步
類鎖實際上是作爲對象鎖實現的。當JVM加載一個類文件時,它創建一個類java.lang.Class的實例。當你鎖定一個類時,你實際上鎖定了該類的Class對象。
但是根據Java規範,堆上相同類型(類)的所有對象共享單個Class對象。 那麼對於多線程同步訪問Objects的情況如何呢?
我正在通過this link。據此:「Class」類對象鎖定實現同步
類鎖實際上是作爲對象鎖實現的。當JVM加載一個類文件時,它創建一個類java.lang.Class的實例。當你鎖定一個類時,你實際上鎖定了該類的Class對象。
但是根據Java規範,堆上相同類型(類)的所有對象共享單個Class對象。 那麼對於多線程同步訪問Objects的情況如何呢?
類鎖
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
。
但是根據Java規範,堆中相同類型(類)的所有對象共享單個Class對象。那麼對於多線程同步訪問對象,這怎麼可能呢?
只有同步靜態方法將需要線程獲取類對象的鎖。所有同步的實例方法都需要相關的實例對象的鎖,它不共享。
但是根據java規範,堆 上的所有同類型(類)的對象共享單個Class對象。那麼對於多線程 同步訪問對象,這怎麼可能是真的?
類級鎖在靜態方法中更有意義。如果在靜態方法上使用synchronized關鍵字,則其監視器用於鎖定的對象是類對象,即由文字Class.class表示的對象。
@assylias你是對的。我想表明,對象是什麼並不重要,但不想與「對象」這個詞混淆。 –