maanantai 15. kesäkuuta 2009

Säieturvallinen singleton 1/2: Java


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.