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.

public class Singleton {

static Singleton instance;

public static synchronized Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}

}

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) :

public class Singleton {

static class SingletonHolder {
static final Singleton instance = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.instance;
}

}

Non male.