Jeśli zsynchronizowałem dwie metody w tej samej klasie, czy mogą one działać jednocześnie na tym samym obiekcie ? na przykład:
class A {
public synchronized void methodA() {
//method A
}
public synchronized void methodB() {
// method B
}
}
Wiem, że nie mogę uruchomić methodA()
dwa razy tego samego obiektu w dwóch różnych wątkach. to samo w methodB()
.
Ale czy mogę uruchomić methodB()
inny wątek, gdy methodA()
jest on nadal uruchomiony? (ten sam obiekt)
obj.methodB()
jest synonimemA.methodB()
kiedymethodB()
jeststatic
. Dlatego tak, będą blokować (na monitorze klasy, a nie obiektu)..class
obiektu. Więc jeśli maszclass A {static synchronized void m() {} }
. A potem jeden wątek wywołujenew A().m()
blokadęnew A()
obiektu. Jeśli wtedy inny wątek wywołaA.m()
to WPISZ METODĘ BEZ PROBLEMU, ponieważ to, czego szuka, to zablokowanieA.class
obiektu, podczas gdy ŻADNE NITKI nie mają tego rodzaju blokady . Więc nawet jeśli zadeklarowałeś metodę,synchronized
to faktycznie JEST ona dostępna przez dwa różne wątki W TYM SAMYM CZASIE . Zatem: nigdy nie używaj odwołań do obiektów do wywoływania metod statycznychW przykładzie methodA i methodB są metodami instancji (w przeciwieństwie do metod statycznych). Wprowadzenie
synchronized
metody instancji oznacza, że wątek musi uzyskać blokadę („wewnętrzną blokadę”) na instancji obiektu, do której metoda jest wywoływana, zanim wątek będzie mógł rozpocząć wykonywanie dowolnego kodu w tej metodzie.Jeśli masz dwie różne metody wystąpienia oznaczone jako zsynchronizowane, a różne wątki wywołują te metody jednocześnie na tym samym obiekcie, te wątki będą rywalizować o tę samą blokadę. Gdy jeden wątek zostanie zablokowany, wszystkie inne wątki zostaną odcięte od wszystkich zsynchronizowanych metod instancji tego obiektu.
Aby te dwie metody działały jednocześnie, musiałyby używać różnych blokad, na przykład:
gdzie zsynchronizowana składnia bloku pozwala określić konkretny obiekt, którego wątek wykonawczy musi uzyskać wewnętrzną blokadę, aby wejść do bloku.
Ważną rzeczą do zrozumienia jest to, że chociaż umieszczamy słowo kluczowe „zsynchronizowane” na poszczególne metody, podstawową koncepcją jest wewnętrzna blokada za kulisami.
Oto jak samouczek Java opisuje tę relację:
Celem blokowania jest ochrona udostępnianych danych. Możesz użyć oddzielnych blokad, jak pokazano w powyższym przykładowym kodzie, tylko wtedy, gdy każdy zamek chronił różnych członków danych.
źródło
static synchronized
lubsynchronized (A.class)
Java Thread uzyskuje blokadę na poziomie obiektu, gdy wchodzi do zsynchronizowanej metody Java z instancją , a blokuje na poziomie klasy, gdy przechodzi do statycznej zsynchronizowanej metody Java.
W twoim przypadku metody (instancja) są tej samej klasy. Więc kiedy wątek wchodzi do metody lub bloku zsynchronizowanego z Javą, uzyskuje blokadę (obiekt, na którym metoda jest wywoływana). Dlatego nie można wywołać innej metody w tym samym czasie na tym samym obiekcie, dopóki pierwsza metoda nie zostanie zakończona i nie zostanie zwolniona blokada (na obiekcie).
źródło
private final Object lock = new object();
z synchronizowanym, aby umożliwić tylko jednemu wątkowi wykonanie jednej z metod? DziękiW twoim przypadku zsynchronizowałeś dwie metody na tej samej instancji klasy. Tak więc te dwie metody nie mogą działać jednocześnie w innym wątku tej samej instancji klasy A. Ale mogą działać na różnych instancjach klasy A.
jest taki sam jak:
źródło
private final Object lock = new Object();
i teraz używamlock
z synchronizowanym blokiem w dwóch metodach, to czy twoje oświadczenie będzie prawdziwe? IMO, ponieważ Object jest klasą nadrzędną wszystkich obiektów, więc nawet jeśli wątki znajdują się w różnych instancjach tej klasy, tylko jeden może uzyskać dostęp do kodu w zsynchronizowanym bloku na raz. Dzięki.Z linku do dokumentacji Oracle
Synchronizacja metod ma dwa skutki:
To odpowie na twoje pytanie: na tym samym obiekcie nie możesz wywołać drugiej zsynchronizowanej metody, gdy pierwsza zsynchronizowana metoda jest wykonywana.
Spójrz na tę stronę dokumentacji, aby zrozumieć wewnętrzne blokady i zachowanie blokad.
źródło
Pomyśl o swoim kodzie jak o poniższym:
Zatem synchronizacja na poziomie metody oznacza po prostu synchronizację (to). jeśli jakikolwiek wątek uruchamia metodę tej klasy, uzyskałby blokadę przed rozpoczęciem wykonywania i wstrzymałby ją do zakończenia wykonywania metody.
Rzeczywiście, nie jest to możliwe!
W związku z tym wiele wątków nie będzie w stanie jednocześnie uruchomić dowolnej liczby zsynchronizowanych metod na tym samym obiekcie.
źródło
Dla jasności jest możliwe, że zarówno statyczna, jak i niestatyczna metoda synchronizowana mogą działać jednocześnie lub współbieżnie, ponieważ jedna ma blokadę na poziomie obiektu i inną blokadę na poziomie klasy.
źródło
Klucz pomysł z synchronizacją, który nie tonąć w łatwo jest to, że będzie to miało wpływ tylko wtedy, gdy metody nazywane są na tym samym obiekcie przykład - to już zostało podkreślone w odpowiedziach i komentarze -
Poniższy przykładowy program ma wyraźnie wskazać to samo -
Zwróć uwagę na różnicę w wynikach, w jaki sposób jednoczesny dostęp jest dozwolony zgodnie z oczekiwaniami, jeśli metody są wywoływane w różnych wystąpieniach obiektów.
Ouput z noEffectOfSynchronizedAsMethodsCalledOnDifferentObjects () skomentował -the wyjście jest w porządku sposób A w> sposób A schodzi .. MethodB w> MethodB Out
i Ouput z synchronizedEffectiveAsMethodsCalledOnSameObject () komentuje - wskazywało na jednoczesny dostęp metodaA przez thread1 i Thread0 w zaznaczonej sekcji, -
Zwiększenie liczby wątków sprawi, że będzie on jeszcze bardziej zauważalny.
źródło
Nie, nie jest to możliwe, gdyby było to możliwe, obie metody mogłyby aktualizować tę samą zmienną jednocześnie, co mogłoby łatwo uszkodzić dane.
źródło
Tak, mogą działać jednocześnie oba wątki. Jeśli utworzysz 2 obiekty klasy, ponieważ każdy obiekt zawiera tylko jedną blokadę, a każda zsynchronizowana metoda wymaga blokady. Więc jeśli chcesz działać jednocześnie, utwórz dwa obiekty, a następnie spróbuj uruchomić, używając tych odniesień do obiektów.
źródło
Synchronizujesz go na obiekcie, a nie na klasie. Nie mogą więc działać jednocześnie na tym samym obiekcie
źródło
Dwa różne wątki wykonujące wspólną metodę synchronizowaną na jednym obiekcie, ponieważ obiekt jest taki sam, gdy jeden wątek używa go metodą synchroniczną, będzie musiał zmienić blokadę, jeśli blokada jest włączona, ten wątek przejdzie w stan oczekiwania, jeśli blokada jest wyłączona, wówczas może uzyskać dostęp do obiektu, podczas gdy uzyska dostęp, włączy blokadę i zwolni blokadę dopiero po zakończeniu wykonywania. kiedy nadejdą kolejne wątki, zmieni blokadę, ponieważ jest włączona, będzie czekała, aż pierwszy wątek zakończy swoje wykonanie i zwolni blokadę nałożoną na obiekt, po zwolnieniu blokady drugi wątek uzyska dostęp do obiektu i włączy blokadę do czasu jej wykonania. więc wykonanie nie będzie współbieżne, oba wątki będą wykonywane jeden po drugim,
źródło