Может ли метод `ConcurrentHashMap :: get` вернуть« грязное »значениеkkkjjjjj? - PullRequest
0 голосов
/ 15 мая 2018

При записи значения с помощью метода put, если другой поток попытается прочитать значение для того же ключа, что получит поток чтения?Старое значение, новое значение или какое-то «мусорное» значение?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

get второго потока увидит новое значение, если операция put первого потока завершена. В противном случае он увидит старое значение.

Обратите внимание, что "завершено" не является четко определенным понятием в этом контексте. Операция может считаться завершенной до того, как вызов put вернется.

Но вы можете полагаться на две вещи:

  • Второй поток не увидит ссылку на мусор. Это всегда будет ссылка на действительный объект.
  • Второй поток 1 сможет увидеть все записи, сделанные для объекта, выполненного первым потоком до того, как он вызвал put.

Последнее гарантируется моделью памяти Java как следствие произойдет до , о котором говорит Javadoc.


1 - Предполагается, что в промежуточном интервале между put первого потока и вторым потоком, обращающимся к объекту, возвращаемому get.

, нет никаких других обновлений объекта.
0 голосов
/ 15 мая 2018

Из Javadoc :

Извлечения отражают результаты самых последних завершенных операций обновления, проведенных с момента их появления.(Более формально, операция обновления для данного ключа имеет отношение «происходит до» с любым (не нулевым) поиском для этого ключа, сообщающего об обновленном значении.)

...