Ciao di seguito è riportato lo snippet della seconda edizione di Java efficace. Qui l'autore sostiene che il seguente codice è il 25% più veloce di quello in cui non si usa la variabile risultato. In base al libro "Ciò che fa questa variabile è assicurarsi che il campo venga letto solo una volta nel caso comune in cui è già stato inizializzato." . Non riesco a capire perché questo codice sarebbe veloce dopo che il valore è stato inizializzato con il confronto di se non si utilizza il risultato della variabile Locale. In entrambi i casi si avrà una sola lettura volatile dopo l'inizializzazione, indipendentemente dal fatto che si usi il risultato della variabile locale o meno.Perché il doppio controllo del blocco è più rapido del 25% in Joshua Bloch Esempio Java efficace
// 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;
}
Uhm, questa è la prima edizione? Il blocco a doppio controllo è stato scoraggiato da alcuni anni – fge
E il motivo è: http://stackoverflow.com/questions/4926681/why-is-double-checked-locking-broken-in-java?rq=1 – Lenymm
@fge : Non proprio. Dal momento che Java 5, in realtà è un modello OK: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html –