2013-03-04 19 views
5

Dlaczego poniższy kod nie prowadzi do zakleszczenia? Mam na myśli po wywołaniu getNumber (.) Obiekt klasy Test powinien być zablokowany, więc nie powinienem mieć dostępu do getNumber2 (.).Wywołanie zsynchronizowanej metody z metody zsynchronizowanej, obu tego samego obiektu.

class Test() { 
    synchronized int getNumber(int i){ 
     return getNumber2(i); 
    } 

    synchronized int getNumber2(int i) { 
     return i; 
    } 

    public static void main(String[] args) { 
     System.out.println((new Test()).getNumber(100)); 
    } 
} 

wyjściowa:

100 
+0

Podobne posty: http://stackoverflow.com/questions/5798637/is-it-safe-to-call-a-synchronized-method-from-another-synchronized-method – Walls

+0

Tak, to pytanie jest takie samo , ale kontekst jest zupełnie inny. Na to pytanie pytał o martwą kłódkę, drugą o bezpieczeństwo nici. – Lovera

Odpowiedz

19

To dlatego, że blokada jest ponownie wejść na rynek, co oznacza, że ​​może on być nabyty kilka razy w tym samym wątku.

Z Java tutorial:

reentrant Synchronizacja

Przypomnijmy, że wątek nie może uzyskać blokadę posiadanych przez inny wątek. Ale wątek może uzyskać zamek, który już posiada. Umożliwienie wątku, aby uzyskać tę samą blokadę więcej niż raz, umożliwia ponowną synchronizację. Opisuje sytuację, w której zsynchronizowany kod, bezpośrednio lub pośrednio, wywołuje metodę, która zawiera również zsynchronizowany kod, a oba zestawy kodu używają tego samego zamka. Bez synchronizacji z synchronizacją zsynchronizowany kod musiałby podjąć wiele dodatkowych środków ostrożności, aby uniknąć zablokowania wątku.

Odpowiednia część JLS jest §17.1. Synchronization:

Język programowania Java dostarcza wiele mechanizmów komunikacji między wątkami. Podstawową z tych metod jest synchronizacja zaimplementowana za pomocą monitorów. Każdy obiekt w Javie jest powiązany z monitorem, który wątek może zablokować lub odblokować. Tylko jeden wątek na raz może posiadać blokadę na monitorze. Wszelkie inne wątki próbujące zablokować ten monitor są blokowane, dopóki nie uzyskają blokady na tym monitorze. Wątek t może wielokrotnie blokować określony monitor; każde odblokowanie odwraca efekt jednej operacji zamka.

4

To nie prowadzi do impasu, ponieważ gdy wątek wprowadzić zsynchronizowany sposób, co robi jest sprawdzenie, że ma blokadę this, a następnie, jeśli nie, to czeka, aż to może mieć zamek i weź go.

Kiedy nić wchodzi do drugiej synchonizowanej metody w twoim przypadku, ma już blokadę obiektu this, więc może wprowadzić metodę bez blokowania.

Powiązane problemy