Неблокирующее чтение и видимость памяти в ConcurrentHashMap - PullRequest
4 голосов
/ 27 октября 2011

ConcurrentHashMap в Java предлагает чтения для одновременного обновления.Компромисс в этом заключается в том, что результаты чтения ограничены, чтобы отразить только обновление последнее завершенное , когда началось чтение, поэтому оно не указано для отражения последнего состояния элементов.

Однако модель памяти Java AFAIK, без какой-либо формы синхронизации между потоками чтения и записи, обновления потока записи могут не стать видимыми потоку чтения даже после произвольного периода времени.

УчитываяПотоки чтения не блокируются потоками записи. Что служит основанием для гарантии того, что последнее завершенное обновление будет доступно для потока чтения?

Я мог думать только о чем-то, похожем на строки алгоритма сравнения и обмена, но не мог проверить это в исходном коде этой библиотеки.

1 Ответ

5 голосов
/ 27 октября 2011

Считывание значений - это фактически изменчивые нагрузки. Несмотря на то, что он не блокирует, вы гарантируете отношения «до и после», так как магазин тоже нестабилен.

Версия CHM на Java 5,6,7 не использует CAS для обмена ссылками. Но в работах есть более новая облегченная версия, которая использовалась бы в некоторых ее записях.

...