1

java.util.ConcurrentHashMap のソース コードを読んでいるとnext、ConcurrentHashMap$HashEntry のフィールドが final であることがわかります。next:add と removeの値を変更できる操作は 2 つあります。nextしかし、これらの 2 つの操作は、フィールドが最終的なものでなくてもスレッドを安全に実行できます。なぜnextフィールドが最終的なのか理解できません。誰か教えてもらえますか? ありがとう。

4

1 に答える 1

1

final(ほとんどの) 読み取りは同期なしで行わnextれるため、読み取りスレッドがフィールドの初期化された値を確認できるようにするには、onが必要です。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;
    }
于 2011-07-11T09:44:48.110 に答える