3

ConcurrentHashMap在依賴其線程安全性但不同步詳細信息的程序中與Hashtable完全互操作。ConcurrentHashMap文檔說明

我很困惑線程安全vs同步的細節,任何人都可以告訴我一個例子嗎?

回答

10

Hashtable上的教程一看已經每一個方法​​,這是一個公開的信息。例如,您可以繼承Hashtable,添加更多​​方法 - 並且知道您使用的同步機制基本相同,因爲您使用相同的同步機制。

此外,您的代碼可以使用synchronized (myHashTable)塊,從而有效確保在您處於此塊中時不會從其他線程中調用myHashTable方法。

這就是所有「同步細節」哪些是您可以使用的,哪些是您自由使用的(雖然不鼓勵)。

並非如此,ConcurrentHashMap:它是爲線程安全的(甚至更因此在某種意義上,見例如由Peter Lawrey答案)作爲Hashtable,但你沒有告訴這個線程安全是如何實現的。因此,您不能隨意濫用或擴展它:您應該按原樣使用它。

+0

現貨,謝謝! – flash 2012-01-04 15:18:21

0

ConcurrentHashMap允許從多個線程同時修改地圖而不需要阻止它們。

Synchronization and thread safety

+0

只是一個快速的問題,如果它允許多線程修改,那麼它是如何線程安全的? – flash 2012-01-04 15:16:59

+0

@flash你需要一個定義還是一個機制? :)如果有定義,那麼它是「即使你同時從多個線程中改變它,內部結構也不會被破壞」(這與例如'HashMap'不一樣)。如果是關於機制(* how *),則需要閱讀代碼:簡而言之,該技術被稱爲* lock slicing。*不幸的是,除此之外還有更多,並且它不適合註釋。 – alf 2012-01-04 15:25:22

2

通用線程安全got-cha是對於keySet(),entrySet()或values()方法返回的迭代器iterator()對於Hashtable,Vector,Collection.synchronizedXxxx(collection)而言不是線程安全的。雖然該方法本身是線程安全的,只要它返回一個迭代器就可能失效。

ConcurrentHashMap沒有這個問題,因爲它提供了弱一致性。即任何添加,刪除,但不能看到迭代,但其他條目顯示爲預期。