При чтении документации , связанной с потоками и блокировками, меня привлекло предложение, описывающее ключевое слово final
:
Соответственно, компиляторам разрешено сохранять значение окончательного значения. поле кэшируется в регистре и не перезагружается из памяти в ситуациях, когда необходимо перезагружать неконечное поле.
Означает ли это, что если я объявлю final Object object = ...
в качестве переменной экземпляра и затем получить к нему доступ (изменить его внутреннее состояние - object.state
) из анонимных внутренних классов (несколько экземпляров Runnable
), тогда значение object.state
может быть фактически прочитано / записано из / в кэш ЦП и оно (значение object.state
) может не совпадать c между этими Runnable
экземплярами?
Так что, если я хочу быть уверен, что значение object.state
правильно распространяется во всех потоках, которые я должен объявите object
как volatile Object object
вместо?
Спасибо.
Редактировать: я отредактировал свой оригинальный вопрос. И теперь я знаю, что неправильно понял документацию, поэтому ответ на мой последний вопрос NO - volatile/final Object object
не влияет на object.state
- это зависит от того, как object.state
объявлен, инициализирован и / или получен доступ .
Спасибо @Burak Serdar за ответ!