2009-03-04 12 views
5

Ora, non sono sicuro se questa sia una domanda stupida, ti prego di sopportare se è così.Java: cosa, se non altro, è bloccato da metodi sincronizzati oltre all'oggetto a cui appartengono?

Il blocco su un oggetto "ricorsivo", i. e. se due oggetti hanno riferimenti a un terzo oggetto nei loro campi e un thread sta eseguendo un metodo sincronizzato su uno dei due, un altro thread può accedere al terzo oggetto?

// 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

Non è affatto una domanda stupida, solo una base. Nessun danno nel chiedere di comprendere meglio i fondamenti del linguaggio –

+0

Grazie. Ho sentito che dovrebbe essere ovvio, ma non l'ho ancora capito. –

risposta

10

Vale la pena separare i concetti di "blocco" e "blocco di un oggetto". Non c'è una vera idea di "bloccare un oggetto" - c'è "acquisizione (e rilascio)" del blocco associato a un oggetto. Sì, sembra che io sia pignolo, ma la distinzione è importante perché se si parla di un oggetto bloccato, sembra che nessun altro thread sarà in grado di modificare nulla nell'oggetto mentre il blocco è trattenuto.

Invece, significa solo che nessun altro thread sarà in grado di acquisire lo stesso blocco mentre si tiene il blocco. Non esiste alcuna relazione diretta tra il blocco e uno qualsiasi dei contenuti dell'oggetto a cui è associato il blocco.

I metodi dichiarati "sincronizzati" acquisiscono il blocco associato all'istanza dell'oggetto a cui appartengono. Questo rende solo gli altri metodi sincronizzati sullo stesso oggetto in attesa e le istruzioni sincronizzate che si sincronizzano esplicitamente su di esso.

Personalmente non mi piacciono i metodi sincronizzati - mi piace renderlo più chiaro sincronizzando esplicitamente su una variabile membro (privata, finale) che viene utilizzata solo per la sincronizzazione.

+0

Sì, aiuta, ma non sono sicuro di averlo capito davvero. È corretto che solo quelle chiamate blocchino che hanno bisogno della stessa serratura, io. e. chiama a metodi sincronizzati della stessa istanza, mentre procede il codice che blocca un membro di a? –

+0

Sì. Personalmente non mi piacciono i metodi sincronizzati - mi piace renderlo più chiaro sincronizzando esplicitamente su una variabile membro (privata, finale) che viene utilizzata solo per la sincronizzazione. –

+0

Ho modificato quanto sopra nel tuo post, spero, ho capito bene. Grazie! –

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

Solo se si contrassegna il metodo run con ThreadA eseguire il codice sincronizzato o avere in metodi sincronizzati.

Nella JVM, ogni oggetto possiede il cosiddetto monitor. Solo un thread può possedere il monitor associato a un dato oggetto alla volta. Sincronizzato è il modo con cui si dice al thread corrente di andare a prendere il monitor prima di continuare.

Anche la classe stessa possiede un monitor per i metodi statici.

0

Il significato di un "blocco" (in realtà questa variante è chiamato monitor) è interamente una convenzione, non vengono applicate restrizioni di accesso.

Il funzionamento si basa su tutti gli oggetti che si comportano bene e acquisiscono il blocco corrispondente prima di accedere ai dati. Solo incapsulando questo comportamento desiderato all'interno di una classe con controlli di accesso appropriati, è possibile applicarlo per gli oggetti client.

Problemi correlati