Возьмите несинхронизированную карту
Map<Long,Long> map = new HashMap<>();
Когда мы делаем map.put(1,2)
из одного потока, возможно ли, чтобы какой-то другой поток не видел это обновленное значение? Я понимаю, как примитивы и ссылки могут кэшироваться, и поэтому необходима синхронизация при доступе к ним. Но как насчет значений внутри самого объекта?
Итак, скажем, один поток делает:
map.put(1,2)
И другая нить делает
map.get(1)
Может ли этот поток увидеть null
(при условии, что этот поток имеет обновленную ссылку на map
)? Я предполагаю, что он всегда должен видеть обновленное значение, потому что объект не может быть кэширован ни одним потоком.
map
с нарушенными инвариантами. - person Hulk   schedule 03.11.2020put
, но и не то, что было после вызоваput
. Это где-то посередине: некоторые внутренние поля обновлены, а другие нет. - person Hulk   schedule 03.11.2020ConcurrentHashMap
: stackoverflow.com/questions/14947723/ - person Hulk   schedule 03.11.2020HashMap
и многопоточности, это может быть интересно прочитать: Из-за каких деталей реализации этот код так легко выходит из строя? - person Holger   schedule 25.11.2020