Одна вещь, которую не заметил ни один из других ответов, - это то, что атрибут final
обладает специальными свойствами по отношению к модели памяти Java.В результате один поток может безопасно получить доступ к значению атрибута final
, не предпринимая шагов для синхронизации с другими потоками.
FOLLOWUP
Является ли эта JVMконкретный?
Спецификация модели памяти Java является частью Спецификации языка Java, и (AFAIK) не изменился с Java 1.5.В этом смысле это не зависит от JVM.
Однако поведение Java, если вы не следуете правилам (то есть, если ваш код не синхронизирует должным образом использование общих данных), зависит от всех видов вещей.включая оборудование, на котором вы запускаете приложение.
Помимо прочего, модель памяти Java разработана для того, чтобы многоядерные машины могли запускать множество потоков Java без необходимости непрерывной очистки кэшей памяти ... что может снизить производительность.По сути, он определяет некоторые правила, которые гарантируют, что один поток Java будет видеть обновления памяти из другого потока.Если приложение не следует правилам, возможно , что поток увидит устаревшее (устаревшее) значение для некоторого поля, записанного другим потоком, что приведет к случайному неопределенному поведению.