Java synchronized static methods: lock on object or class
Samouczki Javy mówią: "nie jest możliwe przeplatanie dwóch wywołań zsynchronizowanych metod na tym samym obiekcie."
Co to oznacza dla static method
? Ponieważ statyczna metoda nie ma powiązanego obiektu, czy zsynchronizowane słowo kluczowe zablokuje klasę, zamiast obiektu?
8 answers
Tak. :)Ponieważ statyczna metoda nie ma powiązanego obiektu, czy zsynchronizowane słowo kluczowe zablokuje klasę, zamiast obiektu?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-01 08:02:33
Aby dodać trochę szczegółów do Oscara (przyjemnie zwięzłe! odpowiedź, odpowiednia sekcja dotycząca specyfikacji języka Java to 8.4.3.6, 'metody synchronizowane':
Metoda zsynchronizowana nabywa monitor (§17.1) przed wykonaniem. Dla metody klasy (statycznej) używany jest monitor skojarzony z obiektem klasy dla klasy metody. W przypadku metody instancji używany jest monitor skojarzony z tą metodą (obiekt, dla którego metoda została wywołana).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-05 16:39:55
Jedna kwestia, na którą należy uważać (kilku programistów na ogół wpada w tę pułapkę) jest taka, że nie ma związku między zsynchronizowanymi metodami statycznymi a zsynchronizowanymi metodami niestatycznymi, tj.]}
class A {
static synchronized f() {...}
synchronized g() {...}
}
Główna:
A a = new A();
Wątek 1:
A.f();
Wątek 2:
a.g();
F() I g() nie są ze sobą zsynchronizowane i dlatego mogą być wykonywane całkowicie równocześnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-13 11:02:43
Chyba że zaimplementujesz g () w następujący sposób:
g() {
synchronized(getClass()) {
...
}
}
Uważam ten wzorzec za przydatny również wtedy, gdy chcę zaimplementować wzajemne wykluczenie między różnymi instancjami obiektu (co jest potrzebne na przykład podczas dostępu do zewnętrznego zasobu).
Na stronie dokumentacji oracle znajdują się wewnętrzne blokady i synchronizacja
Możesz się zastanawiać, co się stanie, gdy zostanie wywołana statyczna metoda zsynchronizowana, ponieważ statyczna metoda jest powiązana z klasą, A nie z obiektem. w tym przypadku wątek uzyskuje wewnętrzny zamek dla obiektu klasy powiązanego z klasą . tak więc dostęp do statycznych pól klasy jest kontrolowany przez blokadę, która różni się od blokady dla każdej instancji klasa .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-01 08:06:38
Poniższe przykłady dają większą jasność między klasą A blokadą obiektu, mam nadzieję, że poniższy przykład pomoże innym:)
Na przykład poniżej mamy metody jedna acquire class i inne acquire object lock:
public class MultiThread {
public static synchronized void staticLock() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
public synchronized void objLock() throws InterruptedException {
for (int i = 0; i < 10; i++) {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
Więc teraz możemy mieć następujące scenariusze:
-
Gdy wątki używające tego samego obiektu próbują uzyskać dostęp
objLock
lubstaticLock
metoda w tym samym czasie (tzn. oba wątki próbują uzyskać dostęp do tego samego metoda)Thread-0 0 Thread-0 1 Thread-0 2 Thread-0 3 Thread-0 4 Thread-1 0 Thread-1 1 Thread-1 2 Thread-1 3 Thread-1 4
-
Gdy wątki używają ten sam obiekt próbuje uzyskać dostęp do
staticLock
iobjLock
Metody ten sam czas (próbuje uzyskać dostęp do różnych metod)Thread-0 0 Thread-1 0 Thread-0 1 Thread-1 1 Thread-0 2 Thread-1 2 Thread-1 3 Thread-0 3 Thread-0 4 Thread-1 4
-
Gdy wątki używające innego obiektu próbują uzyskać dostęp do metody
staticLock
Thread-0 0 Thread-0 1 Thread-0 2 Thread-0 3 Thread-0 4 Thread-1 0 Thread-1 1 Thread-1 2 Thread-1 3 Thread-1 4
-
Gdy wątki używające innego obiektu próbują uzyskać dostęp do metody
objLock
Thread-0 0 Thread-1 0 Thread-0 1 Thread-1 1 Thread-0 2 Thread-1 2 Thread-1 3 Thread-0 3 Thread-0 4 Thread-1 4
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-13 20:12:48
Statyczna metoda ma również powiązany obiekt. Należy do klasy.plik klasy w JDK toolkit. Kiedy ... plik klasy ładuje się do pamięci ram, klasy.Klasa tworzy jej instancję o nazwie template object.
Np: - przy próbie wytworzenia obiektu z istniejącej klasy klienta np.
Customer c = new Customer();
Klient.Ładowanie klasy DO PAMIĘCI RAM. W tej chwili zajęcia.klasa w JDK Toolkit tworzy obiekt o nazwie Template object i ładuje tego klienta.klasy do tego obiektu szablonu.Statyczni członkowie ten klient.klasa staje się atrybutami i metodami w tym obiekcie szablonu.
Więc statyczna metoda lub atrybut również ma obiekt
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-09 04:55:00
Dla tych, którzy nie znają statycznej metody synchronizowanej zablokowanej na obiekcie klasy np. dla klasy string jej łańcuch.metoda synchronizowana klasy while instance blokuje bieżącą instancję obiektu oznaczoną słowem kluczowym "this" w Javie. Ponieważ oba te obiekty są różne, mają inną blokadę, więc podczas gdy jeden wątek wykonuje statycznie zsynchronizowaną metodę, inny wątek w Javie nie musi czekać na powrót tego wątku, zamiast tego uzyska oddzielną blokadę oznaczoną bajtem .klasa i wprowadź statyczną metodę zsynchronizowaną.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 02:50:44