Почему эта блокировка с двойной проверкой реализована с помощью отдельного класса-оболочки?

Когда я читал статью в Википедии об идиоме Double Checked Locking , меня смущала ее реализация:

public class FinalWrapper {
    public final T value;
    public FinalWrapper(T value) { 
        this.value = value; 
    }
} 
public class Foo {
    private FinalWrapper helperWrapper = null;

    public Helper getHelper() {
        FinalWrapper wrapper = helperWrapper;

        if (wrapper == null) {
            synchronized(this) {
                if (helperWrapper == null) {
                    helperWrapper = new FinalWrapper(new Helper());
                }
                wrapper = helperWrapper;
            }
        }
        return wrapper.value;
    }
}

Я просто не понимаю, зачем нам создавать оболочку. Разве этого недостаточно?

if (helperWrapper == null) {
    synchronized(this) {
        if (helperWrapper == null) {
            helperWrapper = new FinalWrapper(new Helper());
        }
    }
}    

Это потому, что использование оболочки может ускорить инициализацию, потому что оболочка хранится в стеке, а helperWrapper хранится в куче?

10
задан Konstantin Pelepelin 16 July 2018 в 09:51
поделиться