为什么“下一个”是“下一个”? ConcurrentHashMap$HashEntry 中的字段是最终的

发布于 2024-11-19 13:21:48 字数 223 浏览 4 评论 0原文

我正在阅读 java.util.ConcurrentHashMap 的源代码,发现 ConcurrentHashMap$HashEntry 中的 next 字段是最终的。有两种操作可以修改 next 的值:添加和删除。但这两个操作可以安全地线程完成,即使 next 字段不是最终的。所以我不明白为什么 next 字段是最终的,有人能告诉我为什么吗?谢谢。

I'm reading reading the source code of java.util.ConcurrentHashMap and find that the next field in ConcurrentHashMap$HashEntry is final. There are two operations that is possible to modify the value of next:add and remove. But those two operations cat be done thread safely even though the next field is not final. So I cann't understand why the next field is final, can anyone tell me why? thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

今天小雨转甜 2024-11-26 13:21:49

需要 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;
    }

final on next is needed to ensure that reading threads see the initialized value of the field, because (most of) reads of ConcurrentHashMap happen without synchronization.

Note that, for example, value is not final, therefore reading thread can see a non-initialized value (null) in that field, and have to recheck it under synchronization in that case:

    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;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文