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?

Author: Sumit Singh, 2009-01-13

8 answers

Ponieważ statyczna metoda nie ma powiązanego obiektu, czy zsynchronizowane słowo kluczowe zablokuje klasę, zamiast obiektu?

Tak. :)
 121
Author: OscarRyz,
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).

 194
Author: Cowan,
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.

 78
Author: jfpoilpret,
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).

 13
Author: ,
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
2010-02-05 21:19:12

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 .

 3
Author: Ravindra babu,
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:

  1. Gdy wątki używające tego samego obiektu próbują uzyskać dostęp objLock lub staticLock 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
    
  2. Gdy wątki używają ten sam obiekt próbuje uzyskać dostęp do staticLock i objLock 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
    
  3. 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
    
  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
    
 2
Author: Ravi,
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

 0
Author: Pahansith Gunathilake,
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ą.

 0
Author: Pragya,
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