Dokumentacja Java mówi:
Nie ma możliwości przeplotu dwóch wywołań metod zsynchronizowanych na tym samym obiekcie.
Co to oznacza dla metody statycznej? Ponieważ metoda statyczna nie ma skojarzonego obiektu, czy synchronizowane słowo kluczowe będzie blokować klasę zamiast obiektu?
this
czy blokada uzyskana w metodach instancji - napraw ją Oscar.Aby dodać trochę szczegółów do (przyjemnie zwięzłej!) Odpowiedzi Oscara, odpowiednia sekcja specyfikacji języka Java to 8.4.3.6, `` Metody synchronizowane '' :
źródło
Jedną kwestią, na którą trzeba uważać (kilku programistów zazwyczaj wpada w tę pułapkę) jest to, że nie ma połączenia między zsynchronizowanymi metodami statycznymi a zsynchronizowanymi metodami niestatycznymi, tj .:
Główny:
Wątek 1:
Wątek 2:
f () i g () nie są zsynchronizowane ze sobą i dlatego mogą być wykonywane całkowicie współbieżnie.
źródło
synchronized (MyClass.class) {...}
.O ile nie zaimplementujesz g () w następujący sposób:
Uważam, że ten wzorzec jest przydatny również wtedy, gdy chcę zaimplementować wzajemne wykluczanie między różnymi instancjami obiektu (co jest potrzebne na przykład przy dostępie do zasobu zewnętrznego).
źródło
getClass()
zwraca typ środowiska uruchomieniowego ; jeśli podklasujesz klasę, to klasa nadrzędna i klasa potomna będą synchronizowane na różnych blokadach.synchronized(MyClass.class)
jest dobrym rozwiązaniem, jeśli chcesz upewnić się, że wszystkie instancje używają tej samej blokady.Zajrzyj na stronę dokumentacji oracle na temat Intrinsic Locks and Synchronization
źródło
Metoda statyczna ma również powiązany obiekt. Należy do pliku Class.class w zestawie narzędzi JDK. Gdy plik .class ładuje się do pamięci RAM, klasa Class.class tworzy jego instancję o nazwie obiekt szablonu.
Np .: - gdy próbujesz stworzyć obiekt z istniejącej klasy klienta np
Klasa Customer.class ładuje się do pamięci RAM. W tym momencie Class.class w zestawie narzędzi JDK tworzy obiekt o nazwie obiekt szablonu i ładuje tę klasę Customer.class do tego obiektu szablonu. Statyczne elementy składowe klasy Customer.class stają się atrybutami i metodami w tym obiekcie szablonu.
Zatem statyczna metoda lub atrybut również ma obiekt
źródło
Poniższe przykłady dają większą jasność między blokadą klasy i obiektu, mam nadzieję, że poniższy przykład pomoże również innym :)
Na przykład mamy poniżej metody, z których jedna uzyskuje klasę, a druga uzyskuje blokadę obiektu:
Więc teraz możemy mieć następujące scenariusze:
Gdy wątki używające tego samego obiektu próbują uzyskać dostęp do metody
objLock
LUB wstaticLock
tym samym czasie (tj. Oba wątki próbują uzyskać dostęp do tej samej metody)Gdy wątki używające tego samego obiektu próbują uzyskać dostęp
staticLock
iobjLock
metody w tym samym czasie (próbują uzyskać dostęp do różnych metod)Gdy wątki używające innego obiektu Object próbują uzyskać dostęp do
staticLock
metodyGdy wątki używające innego obiektu Object próbują uzyskać dostęp do
objLock
metodyźródło
Dla tych, którzy nie są zaznajomieni ze statyczną metodą synchronizowaną zablokowaną na obiekcie klasy, np. Dla klasy string, jej String.class, podczas gdy instancja synchronizowana metoda blokuje bieżącą instancję Object oznaczoną słowem kluczowym „this” w Javie. Ponieważ oba te obiekty są różne, mają różne blokady, więc gdy jeden wątek wykonuje statyczną metodę zsynchronizowaną, inny wątek w java nie musi czekać na powrót tego wątku, zamiast tego uzyska oddzielną blokadę oznaczoną bajtem. Class i wejdzie do statyczna metoda synchroniczna.
źródło