Singleton i java

Odbyłem ostatnio dość ciekwą rozmowę na temat Singleton-ów w Java (nie odmieniam bo to nazwa własna :) ).

Otóż koledzy przekonywali mnie do podwójnie zabezpieczonego i zsynchronizowanego podejścia z modyfikatorem volatile (od wersji 1.5 ). Kod poni?ej:

public class SingletonPierwszy {

private volatile static SingletonPierwszy instancja;

private SingletonPierwszy() {
System.out.println("Instancja utworzona ! " + this);
}

public static SingletonPierwszy instancja() {
System.out.println("pobieram instancje ...");
if (instancja == null) {
synchronized (SingletonPierwszy.class) {
instancja = new SingletonPierwszy();
}
}
return instancja;
}

public static void main(String[] args) {
SingletonPierwszy.instancja();
}
}

Problem z podwójnym sprawdzeniem jednak jest taki …. że nie jest on w środowisku wielowątkowym i multiprocesorowym bezpieczne (polecam pogooglać trochę i można znaleźć wiele artykułów na ten temat).

Drugie rozwiązanie moim zdaniem jest lepsze … stosujemy je od lat i działa :)


public class SingletonDrugi {

private volatile static SingletonDrugi instancja = new SingletonDrugi();

private SingletonDrugi() {
System.out.println("Instancja utworzona ! " + this);
}


public static SingletonDrugi instancja() {
System.out.println("pobieram instancje ...");
return instancja;
}

public static void main(String[] args) {
SingletonDrugi.instancja();
}
}

Różnica jest taka iż ZMIENNE statyczne są inicjowane zaraz na początku, o ile pamiętam taka jest kolejność:

  1. zmienne statyczne
  2. statyczne bloki
  3. zmienne
  4. konstruktor

Drugie rozwiązanie jest zatem pewniejsze niż to przedstawione na początku.

Miłego Singleton-owania :)

Informacje o @albgorski

Od 1999 roku profesjonalnie zajmuję się rozwijaniem oprogramowania. Głównie Java, ale także Groovy, PHP, HTML, JavaScript oraz Adobe Flex. Fascynują mnie metody wymiany danych, ich przechowywania oraz dostępowania. Jestem WIELKIM zwolennikiem Clean Code, TDD oraz agilistą (może lepiej lean-istą). Ekosystem Java dostarcza WIELE świetnych frawework-ów i bibliotek, a społeczność miłośników języka Java jest najlepsza pod słońcem :)
Ten wpis został opublikowany w kategorii java. Dodaj zakładkę do bezpośredniego odnośnika.

Możliwość komentowania jest wyłączona.