Я не могу понять кусок кода в пункте 71 в «Effective Java» о двойной проверки идиомы и одной проверки идиомы для ленивой инициализации полей экземпляра:Одно- и перепроверить ленивая инициализация
Двойная проверка идиома
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) {
synchronized(this) {
result == field;
if (result == null)
field = result = computeFieldValue();
}
}
return result;
}
Single-проверка идиома
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) {
field = result = computeFieldValue();
}
return result;
}
Мы используем блокировку в первом случае, как я понимаю, для того, чтобы compute FieldValue()
выполнялся атомарно. Но почему мы опускаем это во втором случае? Потому что теперь какая-то чужой поток может испортить некоторую ценность, которая принимает участие в вычислении. Что я пропустил?
Строка 6 в приведенном выше примере должна быть результатом = поле; не ==, не так ли? – tamberg