![](/img/trans.png)
[英]What's cheaper: Traversal using n iterators of a single ConcurrentHashMap or n instances of a HashMap
[英]Traversal in ConcurrentHashMap
為什么ConcurrentHashMap
的Entry
類中的值是volatile。
在遍歷期間,有一個檢查ConcurrentHashMap
,當value
的Entry
在零類,它鎖定了整個段,並試圖再次讀取值。 在哪種情況下,值可以單獨為空? 整個條目應該為null,而不僅僅是值。
如果值為空,如何鎖定整個段確保正確的遍歷。
該值主要是volatile,因此ConcurrentHashMap不需要在讀取時阻塞。 當put
CHM將鎖定段以保證每段放置一個但是其他線程仍然允許從該段讀取,並且由於該值是易失性的,因此CHM仍然保持在發生之前的排序。
JMM允許在發布對象后延遲或重新排序構造函數中的volatile存儲。 因此有可能即使條目發布,仍然可以看到volatile字段。 這被認為是'超安全的'但實際上不會發生(至少在Java 6中)
投注完成后,在Segment的鎖定下完成。 當獲得相同的鎖時,您保證在寫入之后任何讀取現在都可以看到后續寫入(這是鎖定和同步的另一個保證,其中在鎖定下發生的寫入對於同一鎖定下的任何將來讀取都是可見的,這樣做但是對於鎖定寫入和易失性讀取不適用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.