Dlaczego podwójne sprawdzanie blokowania jest o 25% szybsze w Joshua Bloch Effective Java Example
Cześć poniżej to fragment z Effective Java 2nd Edition. Tutaj autor twierdzi, że następujący fragment kodu jest o 25% szybszy niż w którym nie używasz zmiennej wynikowej. Według książki „Zmienna ta zapewnia, że pole jest odczytywane tylko raz w typowym przypadku, w którym jest już zainicjowane”. . Nie jestem w stanie zrozumieć, dlaczego ten kod byłby szybki po zainicjowaniu wartości, jak w przypadku, gdy nie korzystamy z wyniku zmiennej lokalnej. W obu przypadkach będziesz mieć tylko jeden odczyt ulotny po inicjalizacji, niezależnie od tego, czy użyjesz wyniku zmiennej lokalnej.
// Double-check idiom for lazy initialization of instance fields
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}