Leggendo questo blog sono venuto a conoscenza di questo interessante problema; Se voglio realizzare un buon singleton , magari utilizzabile in ambiente distribuito, avrò bisogno che metodi esposti siano syncronized, anche quelli statici.
[java]
public class Singleton {
static Singleton instance;
public static synchronized Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}[/java]
Ogni volta che io chiedo l’esecuzione di un getInstance() sfrutto tutta l’infrastruttura di sincronizzazione che invece non è necessaria, serve solo la prima volta! Per ovviare a questo problema nel blog è suggerito di utilizzare l’idioma Inizialization on Demand Holder (IODH) :
[java]
public class Singleton {
static class SingletonHolder {
static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
[/java]
Non male.