Czy istnieje jeden scenariusz (inny niż zgodność ze starożytnymi maszynami JVM), w którym użycie synchronized
jest lepsze niż użycie Lock
? Czy ktoś może uzasadnić używanie nowszych systemów wait
lub korzystanie notify
z nich?
Czy istnieje algorytm, który musi wykorzystywać jeden z nich w swojej implementacji?
Widzę poprzednie pytania, które dotyczyły tej kwestii, ale chciałbym pójść o krok dalej i to właściwie deprecate
. Jest o wiele za dużo pułapek, pułapek i zastrzeżeń, które zostały rozwiązane dzięki nowym obiektom. Po prostu czuję, że wkrótce nadszedł czas, aby oznaczyć je jako przestarzałe.
java
synchronization
deprecation
OldCurmudgeon
źródło
źródło
Odpowiedzi:
Prawie na pewno nie. (Rzeczywiście, z perspektywy teoretycznej, powinieneś być w stanie symulować wait / notify pomocą innego java.util.concurrent. . Klas. I zsynchronizowane można zastąpić wyraźnych działań zamków ... choć trzeba by uważać, aby odblokować w
finally
klauzule).Jednakże, istnieje prawdopodobnie algorytmy gdzie najlepiej wykonując implementacja w Javie polega na bezpośrednie wykorzystanie zsynchronizowane, z lub bez czekać i powiadomić.
Niezależnie od odpowiedzi na poprzednie pytanie, odpowiedź jest zdecydowanie przecząca.
Funkcja oczekiwania / powiadomienia może być (i często jest) używana poprawnie. W Javie wycofanie jest zarezerwowane dla uszkodzonych klas i metod; tzn. gdy dalsze stosowanie powinno zostać skorygowane w trybie pilnym. Gdyby Sun (a teraz Oracle) wycofał coś tak fundamentalnego i tak powszechnego, jak czekanie / powiadamianie, tworzyłby poważny problem ze zgodnością dla dużej ilości starszego kodu. To NIE jest w niczyim interesie.
Jeśli chcesz pozbyć się zsynchronizowanego / czekaj / powiadom w swoim kodzie, to jest w porządku. Ale wycofanie wymaga przepisania dużej ilości zasadniczo poprawnego kodu wielowątkowego, a to byłby ZŁY POMYSŁ. Menedżerowie IT firmy i menedżerowie oprogramowania nienawidzą cię za sugerowanie tego ...
Warto przeczytać, co oznacza „przestarzałe” zgodnie z dokumentacją Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html
Zauważ też, że mówimy o wycofywaniu rzeczy, które są rdzeniem języka Java. Przestarzałe
synchronized
ma ogromne konsekwencje.źródło
java.util.concurrent
klasy util są w rzeczywistości szybsze. Za kulisami klasy te bezpośrednio komunikują się z maszyną wirtualną, gdzie podczas synchronizacji instaluje tępą blokadę obiektu na wykresie obiektowym, a tym samym wpływa na globalną wydajność.synchronized
et. glin. Po prostu sugeruję wycofanie, co tak naprawdę mówi tylko, że nie używaj tego do nowego kodu. Nie marzę o tym, by sugerować uszkodzenie wypróbowanego i przetestowanego starszego kodu, domagając się ich usunięcia.