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:
- Qualsiasi numero di thread può essere @ sincronizzato per oggetti diversi.
- Un thread può utilizzare @synchronized per lo stesso oggetto più volte.
- 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.