Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parserutils.php on line 208 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parserutils.php on line 211 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parserutils.php on line 421 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parserutils.php on line 594 Deprecated: Function split() is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/auth.php on line 154 Double checked locking idiom [Flavio Casadei Della Chiesa Wiki]
 
Il contenuto di questo sito è rilasciato sotto licenza Creative Commons License se non specificato diversamente Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/parser.php on line 66 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/lexer.php on line 299 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/handler.php on line 24 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/handler.php on line 51 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/handler.php on line 215 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/handler.php on line 243 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/handler.php on line 305 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/handler.php on line 338 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/handler.php on line 585 Deprecated: Function split() is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/metadata.php on line 296 Deprecated: Assigning the return value of new by reference is deprecated in /web/htdocs/www.flaviocdc.net/home/wiki/inc/parser/xhtml.php on line 918

Double checked locking idiom

A cura di Flavio Casadei Della Chiesa


Copyright (c)  2006  Flavio Casadei Della Chiesa.
     è garantito il permesso di copiare, distribuire e/o modificare
     questo documento seguendo i termini della Licenza per
     Documentazione Libera GNU, Versione 1.1 o ogni versione
     successiva pubblicata dalla Free Software Foundation.

Il Double Checked Locking Idiom è uno dei più subdoli Antipattern della programmazione concorrente in Java. A prima vista sembra un utile strumento per migliorare le performance, tuttavia sotto le regole dell'attuale Java Memory Model questo schema non funziona :-?

public class DoubleCheckedLocking {
    private static Resource _instance
    public static Resource getInstance() {
        if (_instance == null) {
            synchronized (DoubleCheckedLocking.class) {
                if (_instance == null)
                    _instance = new Resource();
                }
            }
       }
       return _instance;
    }
}

Inizializzare un oggetto comporta la scrittura di alcune variabili (stato dell'oggetto), pubblicare un oggetto riguarda la scrittura di altre variabili (il reference). Se non si assicura che pubblicare l'oggetto accada prima che un Thread possa leggerne il reference la scrittura del reference può essere riordinata con le scritture dello stato dell'oggetto.

In tale caso un Thread può vedere un valore aggiornato per il reference, ma un valore non aggiornato per alcune delle variabili che compongono lo stato dell'oggetto. Si ottiene quindi il reference ad un oggetto parzialmente costruito.

Senza utilizzare tecniche troppo elaborate e spesso inutili è possibile risolvere il problema con il seguente codice

public class EagerInstantiation {
 private static final Resource _instance = new Resource();
 public static Resource getResource() {
  return _instance; // :-)
 }
}

Alcuni riferimenti

 
java/jtt/doublecheckedlockingidiom.txt · Ultima modifica: 2008/12/14 19:37 (modifica esterna)
 
Recent changes RSS feed