Почему «следующее» поле в ConcurrentHashMap $ HashEntry является окончательным - PullRequest
1 голос
/ 11 июля 2011

Я читаю, читая исходный код java.util.ConcurrentHashMap и нахожу, что поле next в ConcurrentHashMap $ HashEntry является окончательным. Есть две операции, которые можно изменить значение next: добавить и удалить. Но эти две операции могут выполняться потоком безопасно, хотя поле next не является окончательным. Поэтому я не могу понять, почему поле next является окончательным, может кто-нибудь сказать мне, почему? спасибо.

1 Ответ

1 голос
/ 11 июля 2011

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;
    }
...