2009-08-24 7 views

Répondre

12

Il empêche plusieurs threads d'exécuter le code contenu dans les accolades. Alors qu'un thread exécute ce code, les autres sont bloqués. Lorsque le premier thread est terminé, l'un des threads bloqués exécutera le code synchronisé, et ainsi de suite.

Pourquoi voulez-vous faire cela? Le code dans le bloc peut modifier les objets de sorte qu'ils sont dans un état incohérent jusqu'à ce que les blocs se termine. Ainsi, un deuxième thread entrant trouverait des objets incohérents. A partir de là, le chaos s'ensuit.

Un exemple serait de supprimer un objet d'un pool et de l'insérer dans un autre. Un deuxième thread peut s'exécuter pendant que le premier thread déplace l'objet, puis trouve l'objet référencé dans les deux collections, ou aucun.

Vous pouvez également utiliser ce mécanisme pour empêcher plusieurs threads d'accéder à une ressource conçue pour être utilisée par une ressource (par exemple, une base de données triviale, par exemple).

0

De la défunte Java de référence rapide auparavant à http://www.janeg.ca/scjp/threads/synchronized.html:

thread a Synchroniser effet de sérialisation accès aux blocs de le code en cours d'exécution sur le fil. Sérialiser dans ce contexte signifie en donnant un fil à la fois le droit pour exécuter un bloc de code spécifique.

11

Notez que les deux suivantes sont équivalentes:

synchronized void someMethod() { 
    // ... 
} 

et

void someMethod() { 
    synchronized (this) { 
     // ... 
    } 
}