Может ли метод `ConcurrentHashMap::get` вернуть" грязное "значение kkkjjjjj?

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

2 ответа

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

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

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

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

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


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

Из Javadoc:

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

Другие вопросы по тегам