为什么值在volatile
Entry
类中。ConcurrentHashMap
在遍历过程中,检查
ConcurrentHashMap
当类value
中Entry
的值为 null 时,它会锁定整个段并尝试再次读取该值。在哪种情况下,值可以单独为空?整个条目应该为空,而不仅仅是值。以及如何锁定整个段以确保在值为 null 的情况下正确遍历。
问问题
283 次
1 回答
1
该值主要是易失的,因此 ConcurrentHashMap 不需要在读取时阻塞。当
put
'ing 时,CHM 将锁定段以保证每个段有一个 put,但仍然允许其他线程从该段读取,并且由于值是易失的,CHM 仍然保持发生前的顺序。JMM 允许在对象发布后延迟或重新排序构造函数中的易失性存储。因此,即使条目已发布,也有可能尚未使 volatile 字段可见。这是为了“额外安全”,但实际上不会发生(至少在 Java 6 中)
当进行看跌时,它是在段的锁定下完成的。获取相同的锁时,您保证后续写入现在对所述写入之后的任何读取都是可见的(这是 Lock 和同步的另一个保证,其中在锁下发生的写入将对同一锁下的任何未来读取可见,这确实但是,对于锁定写入和易失性读取并不适用)。
于 2012-01-12T15:07:11.370 回答