簡體   English   中英

ConcurrentHashMap的KeySet迭代器是線程安全的嗎?

[英]Is KeySet iterator of ConcurrentHashMap is threadsafe?

我只是想探索ThreadSafe是什么意思?

以下是我的理解:

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

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

如果我的上述陳述是假的; 只需閱讀以下JAVA DOC中的`ConcurrentHashMap:

keySet:視圖的迭代器是一個“弱一致”的迭代器,它永遠不會拋出ConcurrentModificationException,並保證遍歷構造迭代器時存在的元素,並且可能(但不保證)反映構造之后的任何修改。

上面的語句說keySet迭代器不能保證數據的完整性; 而多線程正在修改集合。

你能回答我嗎,* ConcurrentHashMap的KeySet迭代器是線程安全的嗎?

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

keySet:視圖的迭代器是一個“弱一致”的迭代器,它永遠不會拋出ConcurrentModificationException,並保證遍歷構造迭代器時存在的元素,並且可能(但不保證)反映構造之后的任何修改

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

java.util.concurrent包背后的一般思想是提供一組數據結構,這些數據結構提供了線程安全的訪問而沒有很強的一致性。 這樣,這些對象實現了更高的並發性,然后正確鎖定了對象

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

但是,這並不意味着每個操作都會自動鎖定此類。 諸如putAll和迭代器之類的高級操作不同步。 該課程不具備強大的一致性。 保證操作的順序和時間不會破壞對象,但不能保證生成准確的結果。

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

這與線程安全不同。 即使結果可能會讓您大吃一驚,但您可以放心,不會丟失或意外覆蓋任何內容,可以毫無問題地添加和刪除元素。 如果此行為足以滿足您的要求,建議您使用java.util.concurrent類。 如果需要更多一致性,則需要使用java.util synchronized類或自己使用同步。

根據您的定義, ConcurrentHashMap.keySet()返回的Set 線程安全的。

但是,正如您所包含的引用中所指出的,它可能以非常奇怪的方式起作用。

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

但是,如果您在保留Set時以某種方式鎖定底層Map ,則不會發生此活動,但需要這樣做並不意味着該結構不是線程安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM