Я изучал это, чтобы понять поведение полей final в новом JMM (начиная с 5). Эта концепция ясна: гарантированная видимость инициализированных полей final для всех потоков после того, как объект будет правильно сконструирован.
Но потом, в конце раздела, я прочитал вот это, что меня просто сбивает с толку:
Теперь, сказав все это, если после того, как поток конструирует неизменяемый объект (то есть объект, который содержит только поля final), вы хотите убедиться, что он правильно виден всем другим потоком, вам все равно обычно требуется использовать синхронизацию. Нет другого способа гарантировать, например, что ссылка на неизменяемый объект будет видна второму потоку.
Означает ли это, что хотя отдельные конечные поля (составляющие неизменяемый объект) не имеют проблем с синхронизацией (скажем, с видимостью здесь). Но сам неизменяемый объект при первом создании в потоке может не быть видимым (как правильно созданный) в других потоках?
Если это так, хотя мы можем совместно использовать инициализированные неизменяемые объекты между потоками без каких-либо опасений по поводу небезопасности потоков, но во время создания им требуется «особая забота» о безопасности потоков, как и для других изменяемых объектов?