2011-11-17 32 views
20

uczę java wielowątkowości, znalazłem to trudno zrozumieć, w jaki sposób zsynchronizowane prace bloku:przykładowy kod, aby pokazać jak Java zsynchronizowane bloku działa

synchronized(Object o){ 
    // do something 
    } 

proszę podać jakiś przykład kodu, który może pokazać mi o, Object jest zablokowane. Jak to rozumiem, dostęp do obiektu z innego wątku zostanie zablokowany, gdy blok synchronizowany zostanie sprawdzony?

+0

czy próbowałeś google? –

Odpowiedz

10

Synchronizacja w Javie to ważna koncepcja, ponieważ Java jest językiem wielowątkowym, w którym wiele wątków jest uruchamianych równolegle w celu wykonania całego programu. W wielowątkowym środowisku synchronizacja obiektu java lub synchronizacja klasy Java stają się niezwykle ważne. Synchronizacja w Javie jest możliwa dzięki użyciu słowa kluczowego Java "zsynchronizowane" i "volatile" Współbieżny dostęp obiektów wspólnych w języku Java wprowadza do rodzaju błędów: interferencje wątków i błędy spójności pamięci oraz aby uniknąć tych błędów, musisz poprawnie zsynchronizować obiekt Javy z . umożliwić wzajemne wyłączny dostęp sekcji krytycznej do dwóch wątków

więcej: http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html#ixzz2LOWwnCjH

Proszę spojrzeć na ten Example

10

zsynchronizowane kluczowe mogą być stosowane do statycznych/metod non-statyczne lub bloku kod. Tylko jeden wątek na raz może uzyskać dostęp do metod zsynchronizowanych i jeśli istnieje wiele wątków próbujących uzyskać dostęp do tej samej metody, inne wątki muszą czekać na wykonanie metody przez jeden wątek. synchroniczne słów kluczowych zapewnia blokadę na obiekcie i tym samym zapobiega wyścigu

prosty przykład:

public void synchronized method(){} 
public void synchronized staticmethod(){} 
public void myMethod(){ 

      synchronized (this){    // synchronized keyword on block of code 
      } 

} 

więcej wyjaśnień o zsynchronizowanym bloku i metoda:
synchroniczny blok może wybrać, który obiekt synchronizuje dalej. Metoda zsynchronizowana może używać tylko "tej" (lub odpowiedniej instancji klasy dla metody zsynchronizowanej klasy). Na przykład, są semantycznie równoważne:

synchronized void foo() { 
    ... 
} 

void foo() { 
    synchronized (this) { 
     ... 
    } 
} 

Ten ostatni jest bardziej elastyczny, ponieważ może on konkurować skojarzonego zamka dowolnego obiektu, często zmiennej składowej. Jest również bardziej ziarnisty, ponieważ można wykonywać kod współbieżny przed i po bloku, ale nadal w ramach metody. Oczywiście można równie łatwo zastosować metodę zsynchronizowaną przez refaktoryzację kodu współbieżnego w oddzielne niezsynchronizowane metody. Użyj tego, co czyni kod bardziej zrozumiałym.

0

Synchronizacja opisuje, że jeśli obiekt lub blok jest zadeklarowany jako zsynchronizowany, wówczas tylko jeden proces może uzyskać dostęp do tego obiektu lub bloku na raz. Żaden inny proces nie może zabrać obiektu lub bloku, dopóki nie będzie dostępny. Każdy z obiektów ma jeden obiekt. flaga o nazwie "blokada" ma ustawiony i zresetowany stan. kiedy proces żąda jednego obiektu, sprawdza się, czy wartość blokady jest ustawiona, czy zresetowana. W zależności od tego jeden obiekt jest dostępny dla synchronizowanego procesu. Aby lepiej zrozumieć przykład, możesz zobaczyć ten link. enter link description here

+0

Chociaż może to odpowiedzieć na pytanie, na to pytanie już udzielono odpowiedzi. Proszę wyjaśnić, w jaki sposób twoja odpowiedź jest inna niż te, które już tu są (i zaakceptowane) - lub jak je rozszerza. –

0

Jak większość odpowiedzi obejmowały to, co zsynchronizowane oznacza, chcę dodać jeden dodatkowy punkt, który nie jest wspomniany. Synchronizacja metody lub dołączenie bloku zsynchronizowanego zapewnia, że ​​operacja/zestaw operacji wykonywana jest jako pojedyncza operacja atomowa, aby być precyzyjnym, gdy jeden wątek wykonuje blok synchronizacji na obiekcie, do którego nie może przejść żaden inny wątek, dopóki wątek nie zostanie zakończony jego wykonanie i zwalnia blokadę, którą posiada podczas wchodzenia do bloku.

Blok synchronizacji zapewnia atomowość zbioru instrukcji kodu.

w przeciwieństwie do podanego parametru @lucifier, synchronizacja i lotność nie służą temu samemu celowi, lotny ma na celu zapewnienie, że dwa wątki komunikują się ze sobą i uzyskują największą wartość aktualizacji z pamięci głównej, zamiast uzyskiwać dostęp do wartości z poszczególnych cache.it zapewnia także zachowanie "happen before" dla wykonania.

Na przykład definiowanie zmiennej jako lotnej (volatile int i = 10;) wykonywanie operacji inkrementacji (i ++;) w niezsynchronizowanej metodzie nie daje takiego samego zachowania, gdy (i ++) jest zamknięte w zsynchronizowanym bloku.

1

Wewnętrzne Zamki i synchronizacja

Synchronizacja jest zbudowany wokół wewnętrznego jednostki zwanej wewnętrznej blokady lub monitora blokady. (Specyfikacja API często odnosi się do tego bytu po prostu jako "monitor".) Wewnętrzne blokady odgrywają rolę w obu aspektach synchronizacji: wymuszając wyłączny dostęp do stanu obiektu i ustanawiając zachodzące relacje, które są istotne dla widoczności.

Każdy obiekt ma przypisaną wewnętrzną blokadę. Zgodnie z konwencją wątek wymagający wyłącznego i spójnego dostępu do pól obiektu musi uzyskać wewnętrzną blokadę obiektu przed uzyskaniem do niego dostępu, a następnie zwolnić wewnętrzną blokadę, gdy zostanie ona wykonana. Mówi się, że wątek jest właścicielem wewnętrznej blokady między czasem uzyskania zamka a zwolnieniem blokady. Tak długo, jak wątek jest powiązany z wewnętrzną blokadą, żaden inny wątek nie może uzyskać tej samej blokady. Drugi wątek blokuje się, gdy próbuje zdobyć blokadę.

Gdy wątek zwalnia blokadę wewnętrzną, pomiędzy tymi czynnościami a późniejszym przejęciem tej samej blokady zostaje nawiązana relacja pomiędzy zdarzeniami.

Zamki synchronicznych Metod

Kiedy wątek wywołuje zsynchronizowany sposób, automatycznie nabywa wewnętrzną blokadę na obiekcie i uwalnia go, gdy powróci metoda ta metoda jest. Zwolnienie blokady występuje nawet wtedy, gdy powrót został spowodowany niezatłoczonym wyjątkiem.

Można się zastanawiać, co się dzieje, gdy wywoływana jest statyczna metoda synchronizowana, ponieważ metoda statyczna jest powiązana z klasą, a nie z obiektem. W takim przypadku wątek nabywa wewnętrzną blokadę dla obiektu klasy powiązanego z klasą. Zatem dostęp do pól statycznych klasy jest kontrolowany przez blokadę, która różni się od blokady dla dowolnego wystąpienia klasy.

Powiązane problemy