Pourquoi l'appel wait() est-il toujours contenu dans un bloc synchronisé ?
L'invocation Object.wait() nécessite un placement dans un bloc synchronisé pour éviter une IllegalMonitorStateException. Cela est dû à l'interaction entre l'acquisition du moniteur et la sémantique de wait() :
Acquisition et libération du moniteur :
En Java, chaque objet est associé à un moniteur. Lorsqu'un thread entre dans un bloc synchronisé, il acquiert le moniteur pour cet objet. Cela empêche d'autres threads d'accéder à l'objet simultanément.
Wait() Sémantique :
Wait() libère le moniteur associé à l'objet sur lequel il est invoqué. Lorsqu'un thread appelle wait(), il libère le moniteur et attend qu'un autre thread invoque notify() ou notifyAll() sur le même objet, auquel cas le thread en attente réacquiert le moniteur.
Dommages potentiels sans synchronisation :
S'il était possible d'invoquer wait() en dehors d'un bloc synchronisé, cela permettrait à plusieurs threads d'accéder simultanément à l'objet, ce qui pourrait potentiellement provoquer incohérences ou blocages.
Considérez le scénario suivant :
Rôle de la synchronisation :
Enfermer les appels wait() dans des blocs synchronisés garantit que le moniteur est acquis avant que la condition ne soit vérifiée et que wait() soit invoqué. Cela garantit qu'aucun autre thread ne peut modifier l'état de l'objet ou invoquer notify() jusqu'à ce que le thread en attente ait libéré le moniteur. Cette synchronisation garantit la sécurité des threads et évite les incohérences ou blocages potentiels.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!