konto usunięte

Temat: Jedna istancja obiektu na wszystkie wątki

Witam

Da się coś takiego osiągnąć, żeby obiekt był singletonem, ale współdzielonym przez wszystkie wątki w programie?
Bartosz Borowiec

Bartosz Borowiec Salesforce and Java
backend/integration
developer at Inde...

Temat: Jedna istancja obiektu na wszystkie wątki

Najprościej zrobić cos takiego:
public class Single{
public static Singe instance;

private Single(){

}

public static synchronized Single getInstace(){
if( instance == null){
instance = new Single();
}
return instace;

}

}

Tylko ze trzeba uwazać bo:
1) jesli program działa na klastrze ,czy innym srodowsku rozproszczonym, kazda maszyna wirtualna dba wyłącznie o swoje zmienne i co prowadzi do tego ze na kazdej z nich jest tworzona nowa instancji singletotna :).
Niby oczywiste, ale kuzwa praktycznie podczas kazdej inspekcji kodu EJB widze kwiatki, jak ktos, ze stateless beena wola singletona:). Zgroza normalnie:-)
W takim wypadku można zastosować mechanizmy do replikacji maszyny wirtualnej... , ale to już temacik na dosyc obszerny artykuł. A o wydajności takiego rozwiązania wole przemilczeć....
2) Jesli klasa singletona jest wczytywana przez dwa rożne class loadery. W takim wypadku tez mozemy sie spodziewać ze nawet na jednaj JVM bedą dwie instancje tego samego singletona:)
3) Jeśli singleton ( albo jakaś klasa lub interface z ktorego on dziedziczy) implementuje interface cloneable, Mozna go po prostu sklonować i znowuż mamy dwie instancje:)
4)W przypadku serializacji i desrejalizacji stanu JVN... tez temacik na osobny artykulik.Bartosz Michal Borowiec edytował(a) ten post dnia 01.02.09 o godzinie 11:41

konto usunięte

Temat: Jedna istancja obiektu na wszystkie wątki

Bartosz Michal Borowiec:
Najprościej zrobić cos takiego:
public class Single{
public static Singe instance;

private Single(){

}

public static synchronized Single getInstace(){
if( instance == null){
instance = new Single();
}
return instace;

}

}

O to to! ;) Wiedziałem, że to jakoś prosto można załatwić. Dzięki! ;o)

Tylko ze trzeba uwazać bo:

Spoko, spoko, ja tak tylko dla siebie, nic dużego na tym nie będzie stało.
Krzysztof K.

Krzysztof K. Experienced Software
Engineer

Temat: Jedna istancja obiektu na wszystkie wątki

Mozemy pozbyc sie synchronized i zainicjalizowac zmienna juz w momencie jej definicji. JVM stworzy instancje obiektu "instance" przy pierwszym załadowaniu klasy.

public class Single{
public static Singe instance = new Single();

private Single(){}

public static Single getInstace(){
return instace;
}

}
Jakub L.

Jakub L. Programista

Temat: Jedna istancja obiektu na wszystkie wątki

http://java.sun.com/developer/technicalArticles/Progra...
i wygrzebalem jeszcze http://blogs.techrepublic.com.com/programming-and-deve...

Zdawało mi się także, że widziałem jakąś adnotację odnoszącą siędo singletona, ale teraz nie potrafię tego znaleźć, więc mogło mi się zdawać.
Bartłomiej Orłowski

Bartłomiej Orłowski Programista Java,
J2EE

Temat: Jedna istancja obiektu na wszystkie wątki

Co do samej implementacji singletona to jest jeszcze inne bardzo ciekawe rozwiązanie (od Javy 5) - zastosowanie enuma, np tak:

enum SingleClass {
INSTANCE;
// dodatkowe pola, metody itd.
}

Zalety:
- nie ma problemu z serializacją, JVM sama sie martwi wtedy o to, żeby był 1 obiekt
- Singleton jest typu 'lazy', czyli obiekt tworzy się przy pierwszym wywołaniu (co może być czasem wadą :P)
- bardziej odporny na refleksję

Wady:
- enumy nie mogą dziedziczyć ani być dziedziczone (mogą za to implementować interfejsy)

Poza tym polecam książke: "Effective Java 2nd Edition", Joshua Bloch.

Co do adnotacji singletona w EJB - będzie od EJB 3.1.

Następna dyskusja:

Wszystkie klasy dziedziczące




Wyślij zaproszenie do