1

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

4

1 回答 1

1

final需要onnext以确保读取线程看到该字段的初始化值,因为(大多数)读取ConcurrentHashMap发生在没有同步的情况下。

请注意,例如valueis 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 回答