[英]Is KeySet iterator of ConcurrentHashMap is threadsafe?
我只是想探索ThreadSafe是什么意思?
以下是我的理解:
它看起來像我; 允許多個線程同時訪問集合; 這與其同步無關。 例如,沒有synchronized關鍵字的任何方法; 是線程安全的,意味着多個線程可以訪問它。
開發人員可以選擇在此方法上維護更多邏輯(同步),以便在多線程訪問數據時保持數據完整性。 這與線程安全是分開的。
如果我的上述陳述是假的; 只需閱讀以下JAVA DOC中的`ConcurrentHashMap:
keySet:視圖的迭代器是一個“弱一致”的迭代器,它永遠不會拋出ConcurrentModificationException,並保證遍歷構造迭代器時存在的元素,並且可能(但不保證)反映構造之后的任何修改。
上面的語句說keySet迭代器不能保證數據的完整性; 而多線程正在修改集合。
你能回答我嗎,* ConcurrentHashMap的KeySet迭代器是線程安全的嗎?
我對線程安全的理解是正確的嗎?
keySet:視圖的迭代器是一個“弱一致”的迭代器,它永遠不會拋出ConcurrentModificationException,並保證遍歷構造迭代器時存在的元素,並且可能(但不保證)反映構造之后的任何修改
這本身就解釋了, ConcurrentHashMap的KeySet迭代器是線程安全的。
java.util.concurrent
包背后的一般思想是提供一組數據結構,這些數據結構提供了線程安全的訪問而沒有很強的一致性。 這樣,這些對象實現了更高的並發性,然后正確鎖定了對象
線程安全意味着,即使沒有任何明確的同步,您也不會破壞對象。 在HashTable
和HashMap
一些方法是多線程訪問的潛在問題,例如remove
方法,它首先檢查元素是否存在,然后將其刪除。 這些方法在ConcurrentHashMap
中實現為原子操作,因此您不必擔心會丟失一些數據。
但是,這並不意味着每個操作都會自動鎖定此類。 諸如putAll
和迭代器之類的高級操作不同步。 該課程不具備強大的一致性。 保證操作的順序和時間不會破壞對象,但不能保證生成准確的結果。
例如,如果您通過調用putAll
同時打印對象,則可能會看到部分填充的輸出。 與新插入同時使用迭代器也可能無法反映所引用的所有插入。
這與線程安全不同。 即使結果可能會讓您大吃一驚,但您可以放心,不會丟失或意外覆蓋任何內容,可以毫無問題地添加和刪除元素。 如果此行為足以滿足您的要求,建議您使用java.util.concurrent
類。 如果需要更多一致性,則需要使用java.util
synchronized類或自己使用同步。
根據您的定義, ConcurrentHashMap.keySet()
返回的Set
是線程安全的。
但是,正如您所包含的引用中所指出的,它可能以非常奇怪的方式起作用。
Set
,條目可以隨機出現和/或消失。 即如果你在同一個對象上調用contains
兩次,則兩個結果可能不同。 Iterable
您可以在兩個不同的線程中開始其底層對象的兩次迭代,並發現兩次迭代枚舉不同的條目。 contains
和迭代可能也不匹配。 但是,如果您在保留Set
時以某種方式鎖定底層Map
,則不會發生此活動,但需要這樣做並不意味着該結構不是線程安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.