Почему поле volatile копируется в локальную переменную при двойной проверке блокировки

Я читаю о блокировке с двойной проверкой из 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)отличается, не говоря уже о лучшем, как указано.

5
задан Raedwald 28 December 2018 в 09:16
поделиться