Когда я читал статью в Википедии об идиоме 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 хранится в куче?