1
我正在閱讀閱讀java.util.ConcurrentHashMap的源代碼並發現ConcurrentHashMap $ HashEntry中的next
字段是final。有兩種操作可以修改next
的值:添加和刪除。但是,即使next
字段不是最終的,但這兩個操作仍可以安全地進行。所以我不明白爲什麼next
這個字段是最終的,誰能告訴我爲什麼?謝謝。
我正在閱讀閱讀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;
}
所以,final通過讀取線程確保字段的初始化值正確。但爲什麼HashEntry類本身在ConcurrentHashMap中最終? – AKS