Поточная безопасность объекта int / long / referenceToAObject в Java

Скажем, у меня есть следующий код

int i =0;
setvalue(int i){this.i = i}
getvalue(){return i}

Теперь поток 200 вызывает setValue со случайным числом [a ... b].
И поток 200 вызывает getValue

Теперь, какие все значения увидит поток, вызывающий getValue:

  1. Можно ли увидеть значение, которого нет в наборе [a ... b]?
  2. Гарантированно ли видеть значения только в наборе [a ... b]? Если да, будет полезна некоторая основная информация.
  3. Поведение не определяется jvm?
  4. Изменится ли поведение на long / double / String / referenceToAObject?

РЕДАКТИРОВАТЬ: Меня интересует referenceToAObject, то есть если вместо int i у нас есть Object i в приведенном выше примере. Итак, основной вопрос - это атомарное обновление ссылок?


person Bhuvan    schedule 14.05.2019    source источник
comment
Для примитива int ни один поток не должен видеть промежуточное значение. Но без синхронизации может случиться так, что какой-то поток "зависнет" и увидит только определенные значения. long и double не гарантированно являются атомарными.   -  person Tim Biegeleisen    schedule 14.05.2019
comment
@TimBiegeleisen как насчет referenceToObject   -  person Bhuvan    schedule 14.05.2019
comment
Ссылка всегда является атомарным значением, т.е. никогда не будет указывать на неправильную или недопустимую ячейку памяти, однако это не относится к полям объекта. Для неизменяемых объектов, таких как String, есть гарантия, что вы всегда будете видеть полностью сконструированный объект, но для других объектов доступ к нему без надлежащей синхронизации может привести к несогласованному состоянию. Вы можете видеть, что чтение или запись ссылки - это атомарная операция, но доступ к объекту, стоящему за ней, - это уже другая операция.   -  person Holger    schedule 14.05.2019