我正在阅读 java.util.ConcurrentHashMap 的源代码,发现next
ConcurrentHashMap$HashEntry 中的字段是 final 的。有两种操作可以修改next
:add 和 remove 的值。但是即使该next
字段不是最终的,这两个操作也可以安全地完成线程。所以我不明白为什么这个next
领域是最终的,谁能告诉我为什么?谢谢。
问问题
190 次
1 回答
1
final
需要onnext
以确保读取线程看到该字段的初始化值,因为(大多数)读取ConcurrentHashMap
发生在没有同步的情况下。
请注意,例如value
is not final
,因此读取线程可以null
在该字段中看到未初始化的值 ( ),并且在这种情况下必须在同步下重新检查它:
V get(Object key, int hash) {
if (count != 0) { // read-volatile
HashEntry<K,V> e = getFirst(hash);
while (e != null) {
if (e.hash == hash && key.equals(e.key)) {
V v = e.value;
if (v != null)
return v;
return readValueUnderLock(e); // recheck
}
e = e.next;
}
}
return null;
}
于 2011-07-11T09:44:48.110 回答