Object.wait() doit résider dans un bloc synchronisé pour garantir la sécurité des threads et empêcher IllegalMonitorStateException.
Attendre libère le moniteur associé à l'objet, permettant à d'autres fils pour l'acquérir. Si wait() pouvait être invoqué en dehors d'un bloc synchronisé, un comportement imprévisible pourrait survenir.
Envisagez une implémentation de file d'attente de blocage sans wait() synchronisé :
class BlockingQueue { Queue<String> buffer = new LinkedList<>(); public void give(String data) { buffer.add(data); notify(); // Signal waiting consumer } public String take() throws InterruptedException { while (buffer.isEmpty()) { wait(); // Suspend thread without synchronization } return buffer.remove(); } }
Dans cet exemple :
Ce problème de synchronisation s'applique universellement aux mécanismes d'attente/notification, quelle que soit l'implémentation spécifique. Sans synchronisation, il existe toujours un risque de conditions de concurrence et de comportement imprévisible des threads. Par conséquent, la règle « attendre à l'intérieur de la synchronisation » garantit la sécurité des threads et évite de tels problèmes.
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!