Это действительно деталь реализации, если текущее содержимое памяти объекта, который не синхронизирован, видно другому потоку.
Конечно, существуют ограничения в том, что вся память не хранится в дубликате, и не все инструкции переупорядочиваются, но дело в том, что базовая JVM имеет возможность, если она находит, что это более оптимизированный способ сделать это .
Дело в том, что куча действительно "правильно" хранится в основной памяти, но доступ к основной памяти медленнее по сравнению с доступом к кэшу ЦП или хранением значения в регистре внутри ЦП. Требуя, чтобы значение было записано в память (что и делает синхронизация, по крайней мере, когда снимается блокировка), оно вызывает запись в основную память. Если JVM может игнорировать это, она может повысить производительность.
С точки зрения того, что произойдет в системе с одним ЦП, несколько потоков могут сохранять значения в кэше или регистре даже при выполнении другого потока. Нет гарантии, что существует какой-либо сценарий, в котором значение является видимым для другого потока без синхронизации, хотя это, очевидно, более вероятно. Конечно, за пределами мобильных устройств однопроцессорный процесс идет по пути гибких дисков, так что это не будет долгое время актуальным.
Для дальнейшего чтения я рекомендую Java Concurrency на практике . Это действительно отличная практическая книга на эту тему.