Java/Interblocco ricontrollato: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Ripristino alla versione 8653988 datata 2007-05-10 18:53:56 di Wakeup tramite popup
Riga 30:
return _instance; // :-)
}
}
 
 
 
Un'alternativa è l'utilizzo di una variabile booleana che mantenga lo stato dell'inizializzazione dell'istanza del singleton. Questo impedisce che thread concorrenti possano ottenere un riferimento all'istanza prima che il costruttore dell'oggetto abbia terminato e reso l'oggetto consistente:
 
public class DoubleCheckedLocking {
private static Resource _instance;
private static boolean '''initialized''' = false;
public static Resource getInstance() {
if ('''!initialized''') {
synchronized (DoubleCheckedLocking.class) {
if ('''!initialized''') {
_instance = new Resource();
'''initialized''' = true;
}
}
}
return _instance;
}
}
 
Il momento in cui avviene l'istruzione di assegnazione alla variabile booleana garantisce che il costruttore abbia terminato l'inizializzazione dell'oggetto.
Anche nello scenario in cui il thread che ha avviato la costruzione dell'oggetto non sia ancora uscito dalla sezione critica, qualsiasi altro thread concorrente che ottenga un esito negativo dal primo test fuori dalla sezione critica, restituirà direttamente (senza attendere sul mutex) l'oggetto correttamente inizializzato.
 
Questa soluzione al problema, quindi, si basa sull'idea di non testare direttamente il riferimento all'oggetto, ma una variabile distinta che sia stata settata successivamente alla costruzione dell'oggetto.