И в разделе Использование в Java, последний пример:
Семантику конечного поля в Java 5 можно использовать для безопасной публикации вспомогательного объекта без использования летучих:
< /blockquote>
Код: Выделить всё
public class FinalWrapper {
public final T value;
public FinalWrapper(T value) {
this.value = value;
}
}
public class Foo {
private FinalWrapper helperWrapper;
public Helper getHelper() {
FinalWrapper tempWrapper = helperWrapper;
if (tempWrapper == null) {
synchronized (this) {
if (helperWrapper == null) {
helperWrapper = new FinalWrapper(new Helper());
}
tempWrapper = helperWrapper;
}
}
return tempWrapper.value;
}
}
Почему для корректной работы требуется tempWrapper? Не могу ли я просто удалить его и заменить helperWrapper. Насколько я понимаю, ссылка на создаваемый объект FinalWrapper не перейдет в другие потоки до тех пор, пока его окончательное значение поля не будет инициализировано в конструкторе. Если какой-либо другой поток считает helperWrapper не нулевым, то он должен иметь правильное значение для value.
Подробнее здесь: https://stackoverflow.com/questions/791 ... with-final
Мобильная версия