我正在阅读java.util.ConcurrentHashMap的源代码,发现ConcurrentHashMap$HashEntry中的next
字段是final的。有两种操作可以修改 next
的值:添加和删除。但这两个操作可以安全地线程完成,即使 next 字段不是最终的。所以我不明白为什么 next
字段是最终的,有人能告诉我为什么吗?谢谢。
最佳答案
next
上的 final
需要确保读取线程看到字段的初始化值,因为(大多数)ConcurrentHashMap
的读取是在没有同步的情况下进行的。
请注意,例如,value
不是 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;
}
关于java - 为什么ConcurrentHashMap$HashEntry中的 "next"字段是final的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648148/