Watki w Javie

0

Witam.
Bawie sie troche watkami w Javie i mam pytanie: kiedy przy synchronizacji dostepu to danych objektu powinienem uzywac:

...
synchronized(this){
  //critical code
}
 

A kiedy powieninem uzywac "lockowania" na jakims konkretnym obiekcie:

 
private Object lock = new Object();
...
synchronized(lock){
  //critical code
}

Wiem ze temat watkow jest obszerny i nie ma dobrej, zlej odpowiedzi, ale moze w tej sytuacji macie jakas generalna regule, kiedy uzywac co? A moze uwazacie, ze ta technika jest stara i powienienem juz tylko uzywac java.util.concurrent?

Dzieki za odpowiedzi!

0

Sorry, za powtorzenie pytania 2 krotnie. Firefox mi nawalil.

0

eee WTF? Przecież pokazałeś dwie identyczne sytuacje. Tylko że w jednej masz synchronizację na aktualnym obiekcie.
Sporo zależy od tego co chcesz osiągnąć. Lockuje się na najniższym poziomie na jakim jest sens. Jak zrobisz takiego locka na this w jakimś singletonie to możesz zabić wydajność aplikacji.
Locka zakłada się na obiekt który może być modyfikowany przez wiele wątków jednocześnie.

0

Konstrukcji synchronized(this) na obiektach innych niż prywatne odradza się z powodu łatwości zhakowania kodu z taką blokadą. Nie jestem żadnym specem od bezpieczeństwa - po prostu przeczytałem to w książce Blocha (z uzasadnieniem, którego rozmiar jest zbyt długi na tego posta). Dlatego obecnie jedynym akceptowalnym lockiem jest prywatny obiekt (nie musi być koniecznie Object) byle jego referencja nie wydostała się do kodu ze słabszym poziomem dostępu. Zwykły lokalny/prywatny Object jest o tyle użyteczny, że nie jest niemal do niczego innego przydatny. Jeżeli więc this reprezentuje jakiś obiekt prywatny, to nie ma chyba przeciwwskazań dla przypadku nr 1.

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