Класс 'Effectively Immutable', как Параллелизм Java на практике определяет термин.
Это означает, что, пока ссылки на экземпляры "безопасно публикуются", они неизменны,Безопасная публикация ссылки предполагает использование синхронизации, так что модель памяти Java (JMM) может гарантировать, что вызывающие абоненты увидят значение поля полностью записанным.Например, если поле не является окончательным, а экземпляр создается и передается другому потоку, другой поток может видеть поле в неопределенном состоянии (например, null
, если это ссылка на объект, или только половина из 64-bit long
field).
Если экземпляр используется только в одном потоке, различие не имеет значения.Это связано с тем, что JMM использует семантику « в потоке as-if-serial ».Таким образом, присвоение поля в конструкторе всегда будет происходить до того, как поле будет прочитано.
Если поле было final
, JMM гарантирует, что вызывающие абоненты увидят правильное значение, независимо от того, как ссылкабыл опубликован.Так что final
имеет преимущество, если вы хотите передать экземпляр другим потокам без использования форм синхронизации.