Может ли метод `ConcurrentHashMap::get` вернуть" грязное "значение kkkjjjjj?
При записи значения через put
метод, если другой поток пытается прочитать значение для того же ключа, что получит поток чтения? Старое значение, новое значение или какое-то "мусорное" значение?
2 ответа
Вторая нить get
увидит новое значение, если первый поток put
операция завершена. В противном случае он увидит старое значение.
Обратите внимание, что "завершено" не является четко определенным понятием в этом контексте. Операция может считаться завершенной до put
звонок возвращается.
Но вы можете положиться на две вещи:
- Второй поток не увидит ссылку на мусор. Это всегда будет ссылка на действительный объект.
- Второй поток 1 сможет увидеть все записи, сделанные в объект, сделанные первым потоком до того, как он вызвал
put
,
Последнее гарантируется моделью памяти Java как следствие того, что происходит до того, о чем говорит Javadoc.
1 - это предполагает, что нет никаких других обновлений объекта в промежуточном интервале между первыми потоками put
и второй поток, обращающийся к объекту, возвращенному get
,
Из Javadoc:
Извлечения отражают результаты самых последних завершенных операций обновления, проводимых с момента их появления. (Более формально, операция обновления для данного ключа имеет отношение "происходит до" с любым (не нулевым) поиском для этого ключа, сообщающего об обновленном значении.)