Я читаю о блокировке с двойной проверкой из Effective Java
. Код делает следующее:
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;
}
Он говорит, что использование результата
кажется ненужным, но фактически обеспечивает что поле читается только один раз в общем случае, когда оно уже инициализировано.
Но я этого не понимаю. В чем разница с выполнением if(field == null )
напрямую? Не понимаю, почему если (result == null)
отличается, не говоря уже о лучшем, как указано.