final
на next
необходимо для того, чтобы потоки чтения увидели инициализированное значение поля, поскольку (большинство) операций чтения 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;
}