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