Ovviamente, "sincronizzato" è solo zucchero sintattico - estremamente utile zucchero sintattico.
Se vuoi programmi Java senza zucchero, si dovrebbe scrivere direttamente nel codice Java byte del monitorenter, monitorexit, serratura, e sbloccare operazioni fa riferimento in VM Specifications 8.13 Locks and Synchronization
Ci è un blocco associato a ogni oggetto. La lingua Java di programmazione non fornisce un modo per eseguire il blocco separato e sbloccare le operazioni ; invece, sono implicitamente eseguiti dai costrutti di livello alto che sistemano sempre le operazioni in modo corretto. (La macchina virtuale Java , tuttavia, fornisce separati monitorenter e monitorexit istruzioni che implementano il blocco e sbloccare operazioni.)
Il comando sincronizzato calcola un riferimento ad un oggetto; quindi tenta di eseguire un'operazione di blocco su quell'oggetto e non procede ulteriormente finché l'operazione di blocco non ha completato . (Un'operazione blocco può essere ritardata poiché le regole circa serrature possono impedire il principale memoria di partecipare fino a qualche altro filo è pronto per eseguire uno o più operazioni di sblocco.) Dopo l'operazione serratura è stata eseguita, il il corpo dell'istruzione sincronizzata è eseguito. Normalmente, un compilatore per il linguaggio programmazione Java assicura che l'operazione di blocco attuato da un'istruzione monitorenter eseguita prima dell'esecuzione del corpo del dichiarazione sincronizzato è abbinato da un'operazione di sblocco implementato da un'istruzione monitorexit ogniqualvolta l'istruzione sincronizzata completa, se il completamento è normale o brusco.
Un metodo sincronizzato automaticamente esegue un'operazione di blocco quando è invocato il numero ; il suo corpo non viene eseguito finché l'operazione di blocco non ha completato . Se il metodo è un metodo di istanza, si blocca la serratura associato con l'istanza per cui è stato richiamato (ovvero, l'oggetto che sarà noto come questo durante l'esecuzione del corpo del metodo). Se il metodo è statico, lo blocca il blocco associato all'oggetto classe che rappresenta la classe in cui è definito il metodo. Se l'esecuzione di del corpo del metodo è sempre completata, o normalmente , un'operazione di sblocco è eseguita automaticamente sullo stesso blocco .
Migliore pratica è che se una variabile è mai essere assegnato da un filo e usato o assegnato da un altro, poi tutti accessi a quella variabile deve essere racchiuso in metodi sincronizzati o dichiarazioni sincronizzati.
Anche se un compilatore per il linguaggio di programmazione Java normalmente garanzie uso strutturato di serrature (vedere Sezione 7.14, "Sincronizzazione"), non v'è alcuna garanzia che tutto il codice sottoposto alla macchina virtuale Java sarà obbedire a questo proprietà. Le implementazioni della macchina Java virtuale sono consentite ma non richieste per applicare entrambe le seguenti due regole che garantiscono il blocco strutturato.
Sia T un thread e L un blocco. Poi:
Il numero di operazioni di blocco eseguite da T su L durante un metodo chiamata deve essere uguale al numero di sbloccare operazioni eseguite da T su L durante l'invocazione del metodo se il metodo invocazione completa normalmente o bruscamente.
In nessun momento durante una chiamata di metodo possono il numero di sblocco operazioni eseguite da T su L dal l'invocazione del metodo superare il numero di operazioni serratura eseguita da T su L poiché il metodo.
In termini meno formali, durante un procedimento invocazione ogni operazione di sblocco su L deve corrispondere qualche precedente blocco funzionamento su L.
nota che il bloccaggio e sbloccaggio automaticamente eseguita dal Java la macchina virtuale quando si richiama un metodo sincronizzato viene considerata per durante il richiamo del metodo di chiamata .
Certamente non lo è. Puoi citare le fonti in cui hai sentito questo? – BalusC
@BalusC: vedere la risposta accettata. Penso che le fonti si riferissero semplicemente ai metodi sincronizzati * * come zucchero sintattico - non sono sicuro che sia esattamente corretto o meno, ma almeno non contraddice le mie scoperte come pensavo. @ Skaffman: avrei potuto sbagliare senza 'sincronizzato 'per tutto quello che sapevo :) – Cam
@incrediman' synchronized' su un metodo è più o meno lo stesso di mettere il corpo del metodo in 'sincronizzato (this) {...} '(o per un metodo statico' synchronized (MyClass.class) {...} '). (Viene rappresentato in modo diverso nei file di classe, ma di solito non ti preoccupa.) –