Leggi l'articolo completo su flaviocdc.net
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; // :-) } }
Nessun commento:
Posta un commento