Il contenuto di questo sito è rilasciato sotto licenza Creative Commons License se non specificato diversamente

Unsafe lazy instantiation

In questo Antipattern sono presenti vari problemi, il più ovvio è quello alla creazione di finti Singleton. L'accesso non esclusivo alla getInstance() può favorire la creazione di più istanze differenti della risorsa. Altri e più subdoli problemi sono discussi nel Double checked locking idiom

public class UnsafeLazyInstantiation {
    private static Resource _instance;
    public static Resource getInstance() {
        if (_instance == null)
            _instance = new Resource(); // unsafe publication :-P
        return _instance;
    }
.......
}

La soluzione immediata al problema dei finiti Singleton è la seguente

public class SimpleLazyInstantiation {
    private static Resource _instance;
    public synchronized static Resource getInstance() {
        if (_instance == null)
            _instance = new Resource(); //  sate publication :-|
        return _instance;
    }
.......
}

si nota in fatti che il metodo getInstance() è sincronizzato, non è quindi possibile che due o più Thread vi accedano in contemporanea.

Nonostante il precedente codice sia sicuro può non essere sempre un'ottima cosa sincronizzare il metodo di istanziazione. Java permette il caricamento lazy di una classe tramite il LazyClassLoading utilizzabile tramite gli inizializzatori statici. La versione pulita per l'instanziazione lazy è la seguente

public class EagerInstantiation {
    private static final Resource _instance = new Resource();
    public static Resource getResource() {
        return _instance; // :-)
    }
}
 
java/jtt/unsafelazyinstantiation.txt · Ultima modifica: 2008/12/14 19:37 (modifica esterna)
 
Recent changes RSS feed