Извлечение во время перефразирования в Concurrent HashMap - PullRequest
1 голос
/ 11 апреля 2020

Я читал о реализации Concurrent HashMaps, в которой говорится, что «ConcurrentHashMap не блокируется при выполнении операций поиска, и для обычных операций блокировка отсутствует». Так что, скажем, мы вызываем метод put () и метод get () одновременно. Если put () выполняет перефразирование, нам не нужно синхронизировать метод get (). Метод get () определит сегмент, используя ha sh% N (где N - размер хеш-карты). Разве метод get () не должен влиять из-за перепрошивки?

1 Ответ

1 голос
/ 11 апреля 2020

Перефразировка происходит только при изменении размера таблицы ha sh.

Если get() вызывается во время операции изменения размера, то put() не имеет еще не завершено, поэтому get() не увидит новое значение, которое должно быть.

Помните, что таблицы хранятся в массиве, а массивы имеют фиксированный размер, поэтому измените размер означает совершенно новый стол ha sh. Эта новая таблица ha sh недоступна другим потокам до тех пор, пока не будет выполнено изменение размера. До тех пор все остальные потоки, вызывающие get(), будут видеть старую таблицу ha sh.

...