Двойной проверенный шаблон блокировки с окончательнымJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Двойной проверенный шаблон блокировки с окончательным

Сообщение Anonymous »

Я читал это: https://en.m.wikipedia.org/wiki/Double-checked_locking
И в разделе Использование в 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 как для проверок на null, так и для оператора return может привести к сбою из-за переупорядочения чтения, разрешенного в модели памяти Java. .[14] Производительность этой реализации не обязательно выше, чем у нестабильной реализации.

Почему для корректной работы требуется tempWrapper? Не могу ли я просто удалить его и заменить helperWrapper. Насколько я понимаю, ссылка на создаваемый объект FinalWrapper не перейдет в другие потоки до тех пор, пока его окончательное значение поля не будет инициализировано в конструкторе. Если какой-либо другой поток считает helperWrapper не нулевым, то он должен иметь правильное значение для value.

Подробнее здесь: https://stackoverflow.com/questions/791 ... with-final
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»