Термин «неизменяемый», когда он используется для описания Java-объектов, должен означать поточно-ориентированную неизменность. Если объект является неизменным, обычно подразумевается, что любой поток должен наблюдать то же состояние.
Неизменность однопоточности не очень интересна. Если это то, что действительно упоминается, оно должно быть полностью квалифицировано как «один поток»; лучший термин будет «неизменяемым».
Проблема состоит в том, чтобы дать официальную ссылку на это строгое использование термина «неизменный». Я не могу; это основано на том, как Java bigshots использует термин. Всякий раз, когда они говорят «неизменный объект», они всегда говорят о поточно-безопасных неизменяемых объектах.
Идиоматический способ реализации неизменяемых объектов состоит в использовании полей final
; Семантика final
была специально обновлена для поддержки неизменяемых объектов. Это очень сильная гарантия; на самом деле, final
поля - единственный путь; Поля volatile
или даже блок synchronized
не могут помешать публикации ссылки на объект до завершения конструктора.