Легче понять, почему Java делает это в HashMap
, где метод resize()
устанавливает table = newTab
. Любой метод, который считывал table
во время операции resize()
, извлек бы ссылку из-под них и переназначил ее, что привело бы к непредсказуемому поведению.
Volatile
могло бы обеспечить обновление метода чтения с помощью последний table
; но это совсем не то, что мы хотим. Мы хотим, чтобы метод чтения продолжался непрерывно со значениями, которые были в table
, когда он начал читать.
Synchronized
может блокировать чтение и запись одновременно, но с ухудшением производительности. Если бы мы этого хотели, мы могли бы вернуться к использованию Hashtable
.
То же самое основание c применимо к ConcurrentHashMap
и его более сложному методу transfer()
, который также переназначает ссылку table
. Ссылка копируется в локальную переменную, чтобы не потерять ее при переназначении.