2009-03-04 11 views
5

Teraz nie jestem pewien, czy to jest głupie pytanie, proszę o zachowanie mnie, jeśli tak jest.Java: Co, jeśli w ogóle, jest blokowane przez zsynchronizowane metody oprócz obiektu, do którego należą?

Czy blokada obiektu jest "rekursywna", i. mi. jeśli dwa obiekty mają odniesienia do trzeciego obiektu na swoich polach, a wątek uruchamia zsynchronizowaną metodę na jednym z dwóch, czy jakikolwiek inny wątek może uzyskać dostęp do trzeciego obiektu?

// a and b are some objects that implement Runnable 
// they both reference the same third object 
a.ref = c; 
b.ref = c; 

// a is run in a thread and processes some data in a loop for a long time 
// the method the loop belongs to is declared synchronized 
threadA = new Thread(a); 
threadA.start(); 

a.someSyncedMethod(); // this would block ... 
b.ref.someOtherSyncedMethod(); // ... but would this? 
a.ref.someOtherSyncedMethod(); // ... and how about this? 
+0

To wcale nie jest głupie pytanie - tylko podstawowe. Nie szkodzi, prosząc o lepsze zrozumienie podstaw językowych. –

+0

Dzięki. Czułem, że to powinno być jakoś oczywiste, ale wciąż nie dostałem tego. –

Odpowiedz

10

Warto oddzielić pojęcia "zamek" i "blokowanie obiektu". Nie ma żadnego realnego pojęcia "blokowania obiektu" - istnieje "nabycie (i zwolnienie)" blokady związanej z obiektem. Tak, brzmi to tak, jakbym się pieprzył - ale rozróżnienie jest ważne, ponieważ jeśli mówimy o zablokowanym obiekcie , to brzmi to tak, jakby żadne inne nici nie były w stanie zmienić niczego w obiekcie, gdy ta blokada jest trzymana.

Zamiast tego oznacza to, że żaden inny wątek nie będzie w stanie uzyskać tej samej blokady, gdy zamek jest trzymany. Nie ma bezpośredniego związku między blokadą a dowolną zawartością obiektu, z którym blokada jest powiązana.

Metody zadeklarowane jako "zsynchronizowane" uzyskują blokadę związaną z wystąpieniem obiektu, do którego należą. Powoduje to tylko inne zsynchronizowane metody dotyczące tego samego obiektu oczekiwania i zsynchronizowane instrukcje, które jawnie synchronizują na nim.

Osobiście nie lubię zsynchronizowane sposoby - Chciałbym, aby to wyraźnie jaśniejsze przez synchronizację na (prywatny, końcowego zmiennej składowej), który jest używany tylko do synchronizacji.

+0

Tak, to pomaga, ale nie jestem pewien, czy naprawdę to mam. Czy to prawda, że ​​tylko te połączenia będą blokować tę potrzebę tego samego zamka, i. mi. wywołuje zsynchronizowane metody tej samej instancji, podczas gdy kod, który blokuje członka woluminu, będzie kontynuowany? –

+0

Tak. Osobiście nie lubię zsynchronizowane sposoby - Chciałbym, aby to wyraźnie jaśniejsze przez synchronizację na (prywatny, końcowego zmiennej składowej), który jest używany tylko do synchronizacji. –

+0

Edytowałem powyższe w swoim poście, mam nadzieję, że mam rację. Dzięki! –

1
a.someSyncedMethod(); // this would block ... 

Tylko jeśli oznaczyć albo metodę biegać z zsynchronizowanym lub mają ThreadA kodu run w zsynchronizowanych metod.

W JVM każdy obiekt jest właścicielem tak zwanego monitora. Tylko jeden wątek może być właścicielem monitora powiązanego z danym obiektem naraz. Synchronizacja to sposób, w jaki mówisz bieżącemu wątkowi, aby uzyskać monitor przed kontynuowaniem.

Również sama klasa jest wyposażona w monitor dla metod statycznych.

0

Sens z „lock” (właściwie to wariant nazywa się monitor) jest całkowicie konwencja, żadne ograniczenia dostępu są egzekwowane.

Funkcjonowanie opiera się na wszystkich obiektach są dobrze wychowane i przejmujących odpowiednią blokadę przed uzyskaniem dostępu do danych. Tylko poprzez enkapsulację tego pożądanego zachowania wewnątrz klasy za pomocą właściwych kontroli dostępu można wymusić go dla obiektów klienta.

Powiązane problemy