Интуитивно, ConcurrentHashMap должен вести себя как набор изменчивых переменных; Ключами карты являются переменные адреса. get(key)
и put(key, value)
должны вести себя как волатильное чтение и запись.
Это явно не указано в документе. Тем не менее, я твердо верю, что это так. В противном случае будет много неожиданных, удивительных поведений, которые подрывают логику приложения. Я не думаю, что Дуг Ли сделает это с нами. Конечно, кто-то спрашивает его в списке рассылки concurrency-interest
.
Пусть он подчиняется летучими семантику, мы можем причине, основанной на Java модели памяти -
Все летучие чтения и записи образуют единый общий порядок. Это можно считать псевдо-временной строкой, где на нее читаются/записываются точки.
Неустойчивое чтение видит непосредственную предшествующую летучую запись и видит только запись. «Предшествующий» здесь соответствует псевдо-временной линии.
Псевдосрочная линия может отличаться от «реальной» линии времени. Однако, теоретически, волатильная запись не может быть бесконечно отложена на псевдо-временной линии. И, по праву, две линии времени довольно близки.
Поэтому мы можем быть уверены, что волатильная запись должна стать видимой «очень быстро» для чтения.
Как вы планируете читать данные? –
используя простой get() –
Тогда вам не стоит беспокоиться, оно вернет самое точное значение. –