Singletons and lazy loading


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.