Стоимость использования финальных полей

Мы знаем, что создание полей final является хорошей идеей, поскольку мы обеспечиваем безопасность потоков и неизменяемость, что облегчает анализ кода. Мне любопытно, есть ли связанные с этим затраты производительности.

Модель памяти Java гарантирует этоfinal Field Semantics:

Поток, который может видеть ссылку на объект только после того, как этот объект был полностью инициализирован, гарантированно увидит правильно инициализированные значения для конечных полей этого объекта.

Это означает, что для такого класса

class X {
    X(int a) {
        this.a = a;
    }
    final int a;

    static X instance;
}   

всякий раз, когда поток 1 создает экземпляр, как это

X.instance = new X(43);
while (true) doSomethingEventuallyEvictingCache();

и тема 2 видит это

 while (X.instance == null) {
      doSomethingEventuallyEvictingCache();
 }
 System.out.println(X.instance.a);

он должен напечатать 43. Безfinal Модификатор, JIT или процессор может изменить порядок магазинов (первый магазинX.instance а затем установитьa=43) и поток 2 мог видеть инициализированное по умолчанию значение и вместо него вывести 0.

Когда JIT видитfinal это очевидно воздерживается от переупорядочения. Но это также должно заставить процессор подчиняться порядку. Есть ли связанное снижение производительности?

Ответы на вопрос(1)

Ваш ответ на вопрос