2011-10-06 9 views
7

Zdaję sobie sprawę, że zsynchronizowany blok zapewniony w Javie jest w zasadzie implementacją muteksu wielokrotnego wprowadzania. Czy jednak zsynchronizowany blok atomowy?Zsynchronizowany blok - Java

W jaki sposób obsługiwane są przerwań dla wątków aktualnie wykonywanych w bloku zsynchronizowane - czy po prostu zwolnić blokadę, przywracając wszystkie dotychczas dokonane zmiany?

EDYCJA: W odniesieniu do części Przerwania pytania - w jaki sposób jest ogólnie obsługiwane w Javie. Na przykład widzę wiele przykładów kodu java, w których programiści przechwytują przerwanie, gdy (powiedzmy) wątek znajduje się w kolejce oczekiwania. Jednak w bloku catch wszystko, co robią, to drukowanie, w którym przerwano. Jestem bardziej ciekawy, co tak naprawdę dzieje się z tą nitką? Czy został usunięty z kolejki oczekiwania?

Odpowiedz

4

- niepodzielność

synchroniczne bloki pomóc wdrożyć niepodzielność - ale ich operacje na danych nie można garaunteed być atomowy. Aby stworzyć materiał w zsynchronizowanym bloku atomowym, często używasz atomowych struktur danych, takich jak pobierające i ustawiające, na przykład AtomicBoolean.

Istnieje róg obfitości wielkich klas atomowych, takich jak tablice atomowe int, obsługiwane przez najnowszą wersję java.

- jak przerwania są obsługiwane:

Przerwania nie są jawnie obsługiwane przez synchronizacji - synchroniczne blokuje tylko gaurantee, że podczas wykonywania, blok może nie zostać wprowadzone ponownie w innym wątku.

2

Czy jednak zsynchronizowany blok atomowy?

Tak, zsynchronizowany blok wymusza, że ​​ten blok i każdy blok synchronizowany na tym samym obiekcie są atomowe.

Jak przerwania są obsługiwane:

Przerwania są zupełnie odmienne do synchronizacji w Javie. Każdy wątek ma flagę interruptedStatus ustawioną za każdym razem, gdy wywoływana jest interrupt() w wątku. Metody takie jak Thread.sleep() rzucają wyjątek InterruptedException, jeśli flaga przerwania jest ustawiona i wstrzymują ich spanie.

Należy pamiętać, że Thread.sleep() nie zwalnia żadnych zamków podczas okresu snu. Blokada skojarzona ze zsynchronizowanym blokiem jest zwalniana tylko wtedy, gdy wykonanie wypływa z bloku.

+0

Czyli programiści są w stanie przechwycić zdarzenie Przerwania i zrezygnować z blokady w przypadku, gdy znajduje się wewnątrz zsynchronizowanego bloku? – Hari

+0

@Titan Zsynchronizowany blok jest bardziej równoważny z blokadą zakresu, więc rezygnacja z blokady jest po prostu opuszczeniem tego zakresu. Zauważ, że zdarzenia przerwania są po prostu mechanizmem kontroli wątków niskiego poziomu - podczas gdy mogą być używane w podobnych czasach, są to pojęcia ortogonalne. – Bringer128

1

Więc w zasadzie to jest spełnia programistę do połowu zdarzenie przerwać i zrezygnować blokadę w przypadku jej wewnątrz bloku zsynchronizowanego?

Nie musisz obsługiwać zamka. Jak napisano w JLS 14.18zsynchronizowany Oświadczenie:

Jeżeli wykonanie bloku kończy się normalnie, wtedy blokada jest odblokowane i zsynchronizowane Oświadczenie kończy się normalnie.Jeśli wykonanie bloku zostanie zakończone nagle z jakiegokolwiek powodu, wówczas blokada zostanie odblokowana, a zsynchronizowana instrukcja zakończy się nagle z tego samego powodu, .

Powiązane problemy