W 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:
class A {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
synchronized(lockA) {
//method A
}
}
public void methodB() {
synchronized(lockB) {
//method B
}
}
}
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ę:
Synchronizacja jest zbudowana wokół wewnętrznej jednostki znanej jako wewnętrzna blokada lub blokada monitora. (Specyfikacja API często odnosi się do tej jednostki po prostu jako do „monitora”). Wewnętrzne blokady odgrywają rolę w obu aspektach synchronizacji: wymuszaniu wyłącznego dostępu do stanu obiektu i ustanawianiu relacji zdarzają się przed, które są niezbędne dla widoczności.
Każdy obiekt jest powiązany z wewnętrzną blokadą. Zgodnie z konwencją, wątek, który potrzebuje wyłącznego i spójnego dostępu do pól obiektu, musi uzyskać wewnętrzną blokadę obiektu przed uzyskaniem do nich dostępu, a następnie zwolnić wewnętrzną blokadę, gdy zostanie z nimi zakończona. Mówi się, że wątek posiada wewnętrzną blokadę między momentem uzyskania blokady a zwolnieniem blokady. Tak długo, jak wątek posiada wewnętrzną blokadę, żaden inny wątek nie może uzyskać takiej samej blokady. Drugi wątek zostanie zablokowany, gdy spróbuje uzyskać blokadę.
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.