java - 为什么ConcurrentHashMap$HashEntry中的 "next"字段是final的

标签 java concurrenthashmap java.util.concurrent

我正在阅读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/

相关文章:

java - 设备重启后不显示 Android onesignal 推送通知

Java:在数组中搜索最接近的值

java - 使用redis缓存java对象: why it should be better than a ConcurrentHashMap?

java - ExecutorService 的奇怪行为

Java:线程中出现异常 "AWT-EventQueue-0"java.util.ConcurrentModificationException

java - 我如何为执行程序选择线程数

Java - 机器人按键问题

java - 什么是NullPointerException,我该如何解决?

java - ConcurrentHashMap 作为具有同步的单例缓存

c++ - TBB 并发 HashMap