Когда я читал статью Wikipedias о Double Checked Locking, я смущен этой реализацией:
public class FinalWrapper<T> {
public final T value;
public FinalWrapper(T value) {
this.value = value;
}
}
public class Foo {
private FinalWrapper<Helper> helperWrapper = null;
public Helper getHelper() {
FinalWrapper<Helper> wrapper = helperWrapper;
if (wrapper == null) {
synchronized(this) {
if (helperWrapper == null) {
helperWrapper = new FinalWrapper<Helper>(new Helper());
}
wrapper = helperWrapper;
}
}
return wrapper.value;
}
}
Я просто не понимаю, зачем нам создавать оболочку. Разве этого недостаточно?
if (helperWrapper == null) {
synchronized(this) {
if (helperWrapper == null) {
helperWrapper = new FinalWrapper<Helper>(new Helper());
}
}
}
Это потому, что использование обертки может ускорить инициализацию, потому что оболочка хранится в стеке, а helperWrapper хранится в куче?