2013-10-25 88 views
3

我只是想探索ThreadSafe是什麼意思?ConcurrentHashMap的KeySet迭代器是線程安全的嗎?

下面是我的理解:

它看起來就像是我;允許多個線程同時訪問集合;這與其同步無關。例如任何沒有同步關鍵字的方法;是線程安全的,意味着多線程可以訪問它。

開發人員選擇在多線程訪問時維護此方法的一些邏輯(同步)以保持數據完整性。這與線程安全是分開的。

如果我上面的陳述是錯誤的;剛剛看了下面的JAVA DOC對`的ConcurrentHashMap:

的keySet:視圖的iterator是一個「弱一致」迭代器,不會拋出 ConcurrentModificationException,並且確保遍歷元素構造後迭代器的存在,可能(但不能保證)反映施工後的任何修改。

以上聲明說keySet迭代器不保證數據的完整性;而多線程正在修改集合。

能否請您回答我* ConcurrentHashMap的KeySet迭代器是線程安全的嗎?

而我對線程安全的理解是正確的?

+5

你的問題本身有答案。 – Batty

+1

正如javadoc所說的,這非常清晰,沒有答案能更好地或更清晰地解釋它。你不明白什麼? – Bohemian

+0

ConcurrentHashMap keySet()是線程安全的,因此可能不需要同步或獲取副本。 –

回答

2

的keySet:視圖的iterator是一個「弱一致」迭代器,不會拋出ConcurrentModificationException,並且確保他們在構造迭代器後存在的穿越元素,並且可能(但並不保證)反映任何修改後續建設

這本身就解釋說,ConcurrentHashMap的KeySet迭代器是線程安全的。

+0

所以你的意思是線程安全在訪問數據時沒有數據完整性/一致性。 –

3

java.util.concurrent軟件包背後的一般想法是提供一組數據結構,它們提供了沒有強一致性的線程安全訪問。這樣,這些對象實現更高的併發性,然後正確鎖定對象。

線程安全意味着即使沒有任何明確的同步,也不會破壞對象。在HashTableHashMap某些方法是多線程訪問的潛在問題,如remove方法,它首先檢查該元素是否存在,然後將其刪除。這些方法在ConcurrentHashMap中被實現爲原子操作,因此您不必擔心會丟失一些數據。

但是,這並不意味着這個類是爲每個操作自動鎖定的。高級操作(如putAll和迭代器)不同步。該班級不提供強大的一致性。您的操作順序和時間保證不會破壞對象,但不能保證產生準確的結果。

例如,如果您在調用putAll的同時打印對象,則可能會看到部分填充的輸出。與新插入同時使用迭代器也可能不會像您所引用的那樣反映所有插入。

這與線程安全不同。儘管結果可能讓你感到驚訝,但你可以確信沒有任何東西丟失或被意外覆蓋,元素可以毫無問題地添加到對象中或從對象中移除。如果這種行爲足以滿足您的要求,建議您使用java.util.concurrent類。如果您需要更多一致性,那麼您需要使用java.util的同步類,或者使用自己的同步。

+0

很好的答案。大多數情況下,絕對不需要「順序化」(併發調用被轉換爲任意順序的順序調用,通過'synchronized'&co。),也不需要'確定性順序化',其中併發調用被轉換爲順序調用具體的,可重複的訂單。這就是爲什麼'線程安全'具有完全不同的含義。 – afk5min

1

按照你的定義SetConcurrentHashMap.keySet()返回線程安全。

但是,它可能會採取非常奇怪的方式,正如您在報價中指出的那樣。

  1. 作爲Set,條目可以出現和/或隨機地消失。即如果您在同一個對象上調用contains兩次,那麼這兩個結果可能會有所不同。
  2. 作爲Iterable,您可以在兩個不同的線程中開始其底層對象的兩次迭代,並發現這兩次迭代枚舉了不同的條目。
  3. 進一步,contains和迭代也可能不匹配。

此活動將不會發生,但是,如果你以某種方式被修改鎖定潛在Map,而你有你的Set的保持,但是需要做這並不意味着該結構不是線程安全的。

+0

所以我可以看到很多使用迭代器的不一致;那麼爲什麼它被稱爲Threadsafe ...?或者線程安全是不是數據一致性..? –

+0

@KanagaveluSugumar - 線程安全意味着通過多線程訪問它不會中斷或崩潰。它可能會產生不一致的結果 - 如果你在乎,你必須爲自己辯護。 *開發人員可以選擇在多線程訪問時保持數據完整性的同時保持更多邏輯(同步)。* – OldCurmudgeon

+0

Ohhhhhhhhh ..?是嗎 ..?所以我的理解是正確的..?並且這個http://stackoverflow.com/questions/6324085/what-is-thread-safe-in-java問題的最佳答案是錯誤的,是嗎? –