Singleton-mallissa on Java-ohjelmointikielessä monenkäyttäjänympäristössä mahdollisuus vaikeasti selvitettävään virhetilanteeseen. Patternissa luonnollisesti konstruktori on private-tyyppiä, jolloin luokasta ei voi tehdä instansseja suoraan, vaan on käytettävä getInstance() -metodia. Mutta metodi ei sellaisenaan takaa, että varsinaisen olion luonti tapahtuu oikein. Eli esimerkiksi
public static Singleton getInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}
ei ole säieturvallinen (thread safe).
Aiheesta on perusteellinen selvitys IBM:n sivuilla. Kirjoitukseen pääsee tällä linkillä:
http://www.ibm.com/developerworks/java/library/j-dcl.html
Toinen hyvä kirjoitus on
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Yhteenvetona kirjoituksista voi todeta, että oikea ratkaisu on käyttää singletonin luomiseen staattista alustusta
private static Singleton instance = new Singleton();
jonka jälkeen getInstance() -metodi on hyvin yksinkertainen
public static Singleton getInstance()
{
return instance;
}
Tällä taataan Javan määrittelyjen mukaisessa jvm-totetuksessa säieturvallinen sigletonin luonti.