Singleton z inicjalizacją eager jest thread safe? Jeśli nie to dlaczego?

- Rejestracja:około 21 lat
- Ostatnio:około 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
0
To zależy czy go zaimplementujesz thread safe czy nie. Zapewniam że można napisać eager singletona który thread safe nie będzie (chociaż to juz sztuka). Można też napisać lazy który będzie.
edytowany 2x, ostatnio: Shalom

- Rejestracja:ponad 8 lat
- Ostatnio:44 minuty
- Lokalizacja:U krasnoludów - pod górą
- Postów:4707
1
No niby jest i nie jest. Dwa obiekty Ci się nie stworzą, bo pilnuje tego class loader.
Klasy w javie są ładowane bezpiecznie wątkowo. Nie zostanie odpalona druga inicjalizacja pól statycznych dla danej klasy. Masz maksimum raz gwarantowane (w classloaderze).
Za to są inne problemy, co więcej nawet na jednym wątku:
public class S0 {
private S1 s1;
public static final S0 instance = new S0();
public S0() {
this.s1 = S1.instance;
}
public static void main(String[] args) {
S0.instance.doIt();
}
public void doIt() {
System.out.println("S0 works");
s1.doIt();
}
}
class S1 {
public static final S1 instance = new S1();
private S2 s2;
public S1() {
this.s2 = S2.instance;
}
public void doIt() {
System.out.println("S1 works");
s2.doIt();
}
}
class S2 {
public static final S2 instance = new S2();
private S0 s0;
public S2() {
this.s0 = S0.instance;
}
public void doIt() {
System.out.println("S2 works");
s0.doIt();
}
}
To przykład, ze pole final nie jest final....
edytowany 1x, ostatnio: jarekr000000
Tyvrel
Wytłumaczysz łopatą co to za problem? Moja mała głowa nie widzi tu nic poza przepełnieniem stosu =(

jarekr000000
A odpaliłeś ten kod?
Tyvrel
Dzięki, łapię =) Cudo!
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.