繁体   English   中英

在ConcurrentHashMap中遍历

[英]Traversal in ConcurrentHashMap

  1. 为什么ConcurrentHashMapEntry类中的值是volatile。

  2. 在遍历期间,有一个检查ConcurrentHashMap ,当valueEntry在零类,它锁定了整个段,并试图再次读取值。 在哪种情况下,值可以单独为空? 整个条目应该为null,而不仅仅是值。

  3. 如果值为空,如何锁定整个段确保正确的遍历。

  1. 该值主要是volatile,因此ConcurrentHashMap不需要在读取时阻塞。 put CHM将锁定段以保证每段放置一个但是其他线程仍然允许从该段读取,并且由于该值是易失性的,因此CHM仍然保持在发生之前的排序。

  2. JMM允许在发布对象后延迟或重新排序构造函数中的volatile存储。 因此有可能即使条目发布,仍然可以看到volatile字段。 这被认为是'超安全的'但实际上不会发生(至少在Java 6中)

  3. 投注完成后,在Segment的锁定下完成。 当获得相同的锁时,您保证在写入之后任何读取现在都可以看到后续写入(这是锁定和同步的另一个保证,其中在锁定下发生的写入对于同一锁定下的任何将来读取都是可见的,这样做但是对于锁定写入和易失性读取不适用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM