Скажем, у меня есть следующий код
int i =0;
setvalue(int i){this.i = i}
getvalue(){return i}
Теперь поток 200 вызывает setValue
со случайным числом [a ... b].
И поток 200 вызывает getValue
Теперь, какие все значения увидит поток, вызывающий getValue:
- Можно ли увидеть значение, которого нет в наборе [a ... b]?
- Гарантированно ли видеть значения только в наборе [a ... b]? Если да, будет полезна некоторая основная информация.
- Поведение не определяется jvm?
- Изменится ли поведение на long / double / String /
referenceToAObject
?
РЕДАКТИРОВАТЬ: Меня интересует referenceToAObject
, то есть если вместо int i
у нас есть Object i
в приведенном выше примере. Итак, основной вопрос - это атомарное обновление ссылок?
int
ни один поток не должен видеть промежуточное значение. Но без синхронизации может случиться так, что какой-то поток "зависнет" и увидит только определенные значения.long
иdouble
не гарантированно являются атомарными. - person Tim Biegeleisen   schedule 14.05.2019String
, есть гарантия, что вы всегда будете видеть полностью сконструированный объект, но для других объектов доступ к нему без надлежащей синхронизации может привести к несогласованному состоянию. Вы можете видеть, что чтение или запись ссылки - это атомарная операция, но доступ к объекту, стоящему за ней, - это уже другая операция. - person Holger   schedule 14.05.2019