Singleton Eager

0

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

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.

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....

1 użytkowników online, w tym zalogowanych: 0, gości: 1