En utilisant la méthode du mot clé synchronisé, en utilisant la commande javap pour afficher le bytecode, on constate que le moniteur est utilisé, et s'il est possible d'appeler le moniteur lorsque la synchronisation est implémentée, est-ce que je comprends, non? Veuillez le corriger si vous ne le faites pas. Quelle est la relation entre eux? Quelle est la relation entre la serrure et le moniteur?
D'après la documentation officielle de Verrous et synchronisation ( https://docs.Oracle.com/javase/tutorial/essential/concurrency/locksync.html ):
- La synchronisation est construite autour d'une entité interne connue sous le nom de verrouillage intrinsèque ou verrouillage du moniteur.
- Chaque objet a un verrou intrinsèque qui lui est associé. Par convention, un thread doit acquérir moniteur verro de l'objet avant d'y accéder, puis relâcher moniteur verro une fois qu'il en a fini avec eux. On dit qu'un thread possède le verrou entre le moment où il a acquis le verrou et l'a libéré. Tant qu'un thread possède un verrou de moniteur, 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 le verrou, une relation se produit avant est établie entre cette action et toute acquisition ultérieure du même verrou.
Donc, un moniteur et un verrou ne peuvent pas être comparés pour les différences, ils sont plutôt complémentaires l'un de l'autre. Chaque objet dans Java est associé à un moniteur qu'un thread peut verrouiller ou déverrouiller.
Dans ce document , vous pouvez trouver la réponse à votre question:
Synchronisation. Le langage de programmation Java fournit plusieurs mécanismes pour communiquer entre les threads. La synchronisation la plus élémentaire est la synchronisation, qui est implémentée à l'aide de moniteurs . Chaque objet en Java est associé à un moniteur, qu'un thread peut verrouiller ou déverrouiller.
Verrous
Un verrou est une sorte de données qui fait logiquement partie de l'en-tête d'un objet dans la mémoire du tas. Chaque objet dans une machine virtuelle Java possède ce verrou (ou mutex) que tout programme peut utiliser pour coordonner l'accès multithread à l'objet. Si un thread souhaite accéder aux variables d'instance de cet objet; alors le thread doit "posséder" le verrou de l'objet (définir un indicateur dans la zone de mémoire du verrou). Tous les autres threads qui tentent d'accéder aux variables de l'objet doivent attendre jusqu'à ce que le thread propriétaire libère le verrou de l'objet (désactivez l'indicateur).
Une fois qu'un thread possède un verrou, il peut demander à nouveau le même verrou plusieurs fois, mais doit ensuite le libérer le même nombre de fois avant qu'il ne soit mis à la disposition d'autres threads. Si un thread demande un verrou trois fois, par exemple, ce thread continuera à être propriétaire du verrou jusqu'à ce qu'il l'ait "libéré" trois fois.
Veuillez noter que le verrou est acquis par un thread, lorsqu'il le demande explicitement. En Java, cela se fait avec le mot-clé synchronisé, ou avec wait and notify.
Moniteurs
Monitor est une construction de synchronisation qui permet aux threads d'avoir à la fois une exclusion mutuelle (en utilisant des verrous) et une coopération, c'est-à-dire la possibilité de faire en sorte que les threads attendent que certaines conditions soient remplies (en utilisant wait-set).
En d'autres termes, avec les données qui implémentent un verrou, chaque Java est logiquement associé aux données qui implémentent un ensemble d'attente. Alors que les verrous aident les threads à travailler indépendamment sur les données partagées sans interférer avec un seul) un autre, les files d'attente aident les threads à coopérer les uns avec les autres pour travailler ensemble vers un objectif commun, par exemple, tous les threads en attente seront déplacés vers cet ensemble d'attente et tous seront avertis une fois le verrou libéré. aide supplémentaire de verrouillage (mutex).
Pour plus de précisions, reportez-vous à -
COMPRENDRE LES FILS, LES MONITEURS ET LES SERRURES
Différence entre verrouillage et moniteur - Java Concurrence