Qu'est-ce que le mot clé synchronisé?
Les threads communiquent principalement en partageant l'accès aux champs et aux champs de référence des objets auxquels ils se réfèrent. Cette forme de communication est extrêmement efficace, mais rend possible deux types d'erreurs: les interférences de thread et les erreurs de cohérence de la mémoire . L'outil nécessaire pour éviter ces erreurs est la synchronisation.
Les blocs ou méthodes synchronisés empêchent les interférences de threads et s'assurent que les données sont cohérentes. À tout moment, un seul thread peut accéder à un bloc ou une méthode synchronisée ( section critique ) en acquérant un verrou. Un autre thread attendra la libération du verrou pour accéder à la section critique .
Quand les méthodes sont-elles synchronisées?
Les méthodes sont synchronisées lorsque vous ajoutez synchronized
à la définition ou à la déclaration de méthode. Vous pouvez également synchroniser un bloc de code particulier avec une méthode.
Qu'est-ce que cela signifie pro grammaticalement et logiquement?
Cela signifie qu'un seul thread peut accéder à la section critique en acquérant un verrou. À moins que ce thread ne libère ce verrou, tous les autres threads devront attendre pour acquérir un verrou. Ils n'ont pas accès à la section critique sans avoir à verrouiller.
Cela ne peut pas être fait avec une magie. Il incombe au programmeur d'identifier les sections critiques de l'application et de les protéger en conséquence. Java fournit un cadre pour protéger votre application, mais où et ce que toutes les sections à protéger sont la responsabilité du programmeur.
Plus de détails sur la page de documentation java
Verrous intrinsèques et synchronisation:
La synchronisation est construite autour d'une entité interne connue sous le nom de verrou intrinsèque ou verrou de moniteur. Les verrous intrinsèques jouent un rôle dans les deux aspects de la synchronisation: en imposant un accès exclusif à l'état d'un objet et en établissant des relations préalables qui sont essentielles à la visibilité.
Chaque objet a un verrou intrinsèque qui lui est associé . Par convention, un thread qui a besoin d'un accès exclusif et cohérent aux champs d'un objet doit acquérir le verrou intrinsèque de l'objet avant d'y accéder, puis libérer le verrou intrinsèque lorsqu'il en a fini avec eux.
Un thread est réputé posséder le verrou intrinsèque entre le moment où il a acquis le verrou et relâché le verrou. Tant qu'un thread possède un verrou intrinsèque, aucun autre thread ne peut acquérir le même verrou. L'autre thread se bloquera lorsqu'il tentera d'acquérir le verrou.
Lorsqu'un thread libère un verrou intrinsèque, une relation se produit avant est établie entre cette action et toute acquisition ultérieure du même verrou.
La synchronisation des méthodes a deux effets :
Premièrement, il n'est pas possible que deux invocations de méthodes synchronisées sur le même objet s'entrelacent.
Lorsqu'un thread exécute une méthode synchronisée pour un objet, tous les autres threads qui appellent des méthodes synchronisées pour le même bloc d'objet (suspendre l'exécution) jusqu'à ce que le premier thread soit terminé avec l'objet.
Deuxièmement, lorsqu'une méthode synchronisée se termine, elle établit automatiquement une relation passe-avant avec toute invocation ultérieure d'une méthode synchronisée pour le même objet.
Cela garantit que les modifications de l'état de l'objet sont visibles pour tous les threads.
Recherchez d'autres alternatives à la synchronisation dans:
Évitez synchronisé (ce) en Java?