Этот вопрос несколько продолжение и расширение этого, как мне кажется идеальный вопрос: How does assigning to a local variable help here?Доступ к изменчивым полей через локальные переменные
Этого вопроса, основанный на Item 71
из Effective Java
, где он предложил ускорить работу путем введения локальной переменной в целях доступа volatile
поля:
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
Итак, мой вопрос более общий:
Должны ли мы всегда получать доступ к полям volatile
путем присвоения их значений локальным переменным?(для обеспечения наилучшей производительности архива).
I.e. некоторые идиомы:
мы имеем некоторое
volatile
поле, называют его простоvolatileField
;, если мы хотим, чтобы прочитать его значение в методе многопоточной, мы должны:
- создать локальную переменную с таким же типом:
localVolatileVariable
- присвоить значение летучего поле:
localVolatileVariable = volatileField
чтения значение из этой местной копии, например:
if (localVolatileVariable != null) { ... }
- создать локальную переменную с таким же типом:
Как этот вопрос отличается от того, на который вы ссылаетесь? Кажется, вы хотите получить ответ на ситуацию шире, чем сценарий «инициализируйте ленивую нагрузку» для данного фрагмента кода, показанного там (и здесь). Но я не могу сказать, что ответ не может быть больше, чем «это зависит». – Thilo
Это другое, что я просто хочу понять: эта оптимизация применима только к конкретному случаю, описанному в «Элементе 71», или это обычный подход для чтения «volatile» полей? – Andremoniy