В JDK 1.6 Дуг Ли использует final
, предшествующий полюсу next
.Различные `next` записи ConcurrentHashMap в JDK 1.6 и JDK 1.7
static final class HashEntry<K,V> {
final K key;
final int hash;
volatile V value;
final HashEntry<K,V> next;
В то время как в JDK 1.7, то next
поле предшествует volatile
. Я также замечаю, что в JDK 1.7 метод get
использует метод getObjectVolatile
для чтения поля value
, который имеет семантику летучей нагрузки.
У меня нет никакого смысла, почему Дуг Ли ранее использовал final
. Если есть проблемы с правильностью, то как он может заменить его volatile
в JDK 1.7 (также JDK 1.8)?
Edit:
В частности, мой вопрос заключается в том, что мы могли бы заменить final
с volatile
в JDK 1.6 в реализации?
Этот класс не находится в CHM на Java 8. – assylias
Хорошо, если это ваш вопрос, то нет, вы не можете. Причина, по которой был изменен модификатор, заключается в том, что реализация полностью изменилась. Это не изолированное изменение. – RealSkeptic
@RealSkeptic, могли бы вы представить некоторые подробности или статьи для объяснения? Благодарю. –