web-dev-qa-db-fra.com

exemple de code montrant le fonctionnement du bloc synchronisé Java

J'apprends le multi-threading Java, j'ai eu du mal à comprendre le fonctionnement du bloc synchronisé: 

 synchronized(Object o){
     // do something
    }

donnez s'il vous plaît un exemple de code qui peut me montrer que l'objet o est bloqué. Si je comprends bien, l'accès à l'objet o depuis un autre thread sera bloqué pendant l'exécution du blocage synchronisé.

20
CaiNiaoCoder

La synchronisation en Java est un concept important car Java est un langage multithread où plusieurs threads s'exécutent en parallèle pour compléter l'exécution du programme. Dans un environnement multi-thread, la synchronisation d'un objet Java ou la synchronisation d'une classe Java deviennent extrêmement importantes. La synchronisation en Java est possible en utilisant le mot clé Java "synchronisé" et "volatile". L'accès simultané d'objets partagés en Java introduit des types d'erreur: interférences de threads et erreurs de cohérence de la mémoire. permettre un accès exclusif mutuel de la section critique à deux threads.

En savoir plus: http://javarevisited.blogspot.com/2011/04/synchronization-in-Java-synchronized.html#ixzz2LOWwnCjH

Veuillez regarder ceci Exemple

9
Lucifer

La synchronisation indique que si un objet ou un bloc est déclaré comme étant synchronisé, un seul processus peut accéder à cet objet ou à ce bloc à la fois. Aucun autre processus ne peut prendre l'objet ou le bloc tant qu'il n'est pas disponible. "a deux états définis et réinitialisés. Lorsqu'un processus demande un objet, il est alors vérifié si la valeur de verrouillage est définie ou réinitialisée. En fonction de cela, un objet est disponible pour un processus en synchronisation. Pour une meilleure compréhension avec exemple, vous pouvez voir ce lien. entrez la description du lien ici

1
Mihir Bera

Comme la plupart des réponses ont couvert ce que signifie synchronisé, je souhaite ajouter un point supplémentaire qui n'est pas mentionné . La synchronisation d'une méthode ou l'inclusion d'un bloc avec synchronized garantit que l'opération/l'ensemble d'opérations s'exécutent comme une seule opération atomique, pour être précis quand un thread est en train d'exécuter le bloc synchronize sur un objet, aucun autre thread ne peut entrer dans le bloc tant que le thread 1 n'a pas terminé son exécution et libère le verrou qu'il détient en entrant dans le bloc.

Donc, synchronize block assure l’atmicité de plusieurs instructions de code.

contrairement à ce que @lucifier a spécifié, Synchronizing and volatile ne remplit pas le même objectif, volatile est destiné à garantir que deux threads communiquent et obtiennent la valeur de mise à jour maximale de la mémoire principale au lieu d'accéder à une valeur individuelle de cache.it assure le comportement "se passe avant" pour une exécution.

Par exemple, définir une variable comme volatile (volatile int i = 10;) et effectuer une opération d’incrémentation (i ++;) dans une méthode non synchronisée ne confère pas le même comportement lorsque (i ++) est enfermé dans un bloc synchronisé.

0
k.explorer