3
  1. 为什么值在volatileEntry类中。ConcurrentHashMap

  2. 在遍历过程中,检查ConcurrentHashMap当类valueEntry的值为 null 时,它会锁定整个段并尝试再次读取该值。在哪种情况下,值可以单独为空?整个条目应该为空,而不仅仅是值。

  3. 以及如何锁定整个段以确保在值为 null 的情况下正确遍历。

4

1 回答 1

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

  2. JMM 允许在对象发布后延迟或重新排序构造函数中的易失性存储。因此,即使条目已发布,也有可能尚未使 volatile 字段可见。这是为了“额外安全”,但实际上不会发生(至少在 Java 6 中)

  3. 当进行看跌时,它是在段的锁定下完成的。获取相同的锁时,您保证后续写入现在对所述写入之后的任何读取都是可见的(这是 Lock 和同步的另一个保证,其中在锁下发生的写入将对同一锁下的任何未来读取可见,这确实但是,对于锁定写入和易失性读取并不适用)。

于 2012-01-12T15:07:11.370 回答