Wydaje się, że singleton to jeden z prostszych wzorców projektowych. Jednak jego prawidłowa implementacja w języku Java może przysporzyć sporo problemów. Poniżej przedstawiam implementację, która powinna być bezpieczna w środowisku wielowątkowym, a zarazem nadal wydajna.
/**
* Przykładowa implementacja Singleton w języku Java
* http://en.wikipedia.org/wiki/Singleton_pattern
*
* Dodatkowo wykorzystujemy wzorzce:
* - http://en.wikipedia.org/wiki/Lazy_initialization
* - http://en.wikipedia.org/wiki/Double-checked_locking
*
* @author sebastian@....eu
* @since 2010-04-15
*/
public class Singleton {
// volatile - ważny modyfikator dla poprawnej implementacji DoubleCheckLocking
private volatile static Singleton instance;
// zabezpieczamy się przed "zewnętrznym", bezpośrednim tworzeniem
private Singleton(){
}
public static Singleton getInstance(){
// lazy initialization - obiekt tworzony jest dopiero w momencie pierwszej próby dostępu
// double check locking - ponieważ wykoanie bloku synchronized jest kosztowne - najpierw upewniamy się czy taki blok otwierac
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
} else {
return instance;
}
}
}
COMMENTS
No Comments