Possono essere eseguiti contemporaneamente più metodi sincronizzati nello stesso oggetto

4

Per quanto ne so quando ci sono più metodi sincronizzati (sia static che istanza ) in una classe, java consente solo uno di questi metodo da eseguire alla volta. Ma cosa succede se un thread acquisisce il lock su un'istanza di oggetto (o classe), quindi immette un metodo sincronizzato all'interno di quell'oggetto e quindi effettua una chiamata a un altro metodo sincronizzato dello stesso oggetto. Voglio dire:

Class AA  
{  
 ..  
 ..  
synchronized void X()  
{  
  Y();  
}

synchronized void Y()  
{  
 ..  
 ..  
}  

C'è qualche discussione che prevede il blocco del metodo X per sempre? Dal momento che java non consente di eseguire contemporaneamente sia il metodo X che Y?

    
posta Yeasir 10.06.2015 - 14:09
fonte

3 risposte

9

In Java, i blocchi synchronized sono re-entrant .

O in altre parole se il tuo thread detiene già il blocco su un oggetto che non deve attendere su se stesso.

    
risposta data 10.06.2015 - 14:11
fonte
8

Se leggi attentamente la documentazione di synchronized scoprirai che è esplicitamente dichiarato che una volta che un thread ha acquisito un lock, è permesso di riacquisirlo tutte le volte che vuole.

Secondo la specifica del linguaggio Java:

Sezione 8.4.3.6. "Metodi sincronizzati" dice che la parola chiave synchronized acquisisce un monitor . Vedi: link

La sezione "17.1 Sincronizzazione" dice quindi che Un thread t può bloccare un particolare monitor più volte . Vedi link

Quindi, sono solo i altri thread che devono attendere se un thread ha acquisito un blocco. Lo stesso thread può riacquisire la serratura senza dover aspettare.

    
risposta data 10.06.2015 - 14:18
fonte
0

La sincronizzazione Java utilizza un blocco ricorsivo per l'istanza del metodo sincronizzato. È come se ogni istanza avesse un blocco ricorsivo e @synchronized bloccherebbe quel blocco ricorsivo (JVM usa ovviamente un metodo più intelligente). Pertanto:

  1. Qualsiasi numero di thread può essere @ sincronizzato per oggetti diversi.
  2. Un thread può utilizzare @synchronized per lo stesso oggetto più volte.
  3. Un thread può usare @synchronized per qualsiasi numero di oggetti che @ non sono sincronizzati da nessun altro thread.

Per i metodi di classe @synchronized, viene utilizzato un blocco ricorsivo per la classe stessa. Le stesse regole si applicano come sopra, poiché le classi sono oggetti di prima classe.

java allows only one such method to run at a time

Beh, non è assolutamente vero. Innanzitutto, 10 thread possono chiamare dieci metodi sincronizzati di dieci diverse istanze e possono essere eseguiti tutti alla prima volta. Ogni metodo sincronizzato può a sua volta chiamare altri metodi sincronizzati di altre istanze e, fintanto che non vengono utilizzati con i metodi @synchronized, funzionerà anche. E ogni metodo @synchronized può chiamare ricorsivamente i metodi @synchronized della stessa istanza, per quanto gli piace.

La restrizione è: nessuno dei due thread può eseguire simultaneamente i metodi sincronizzati della stessa istanza, oppure eseguire simultaneamente i metodi della classe @synchronized della stessa classe.

    
risposta data 10.06.2015 - 14:54
fonte

Leggi altre domande sui tag