Maison >Java >javaDidacticiel >Une introduction détaillée à la comparaison entre Java Notify et NotifyAll

Une introduction détaillée à la comparaison entre Java Notify et NotifyAll

黄舟
黄舟original
2017-03-18 10:09:121777parcourir

Cet article présente principalement les informations pertinentes sur la comparaison entre java notify et notifyAll Les amis dans le besoin peuvent se référer à

java notify et notifyAll.

Tout d'abord, vous pouvez comprendre à partir du nom que notify notifie un fil pour acquérir un verrou, et notifyAll notifie tous les fils associés pour concourir pour le verrou.

notify ne garantit pas que le thread qui obtient le verrou a réellement besoin du verrou et peut produire un interblocage.

Exemple 1 :

Tout le monde (fil consommateur) est prêt à manger, la cantine n'est pas ouverte (le verrou n'est pas déverrouillé), la fenêtre repas (serrure) , tout le monde attend ( ATTENDRE).

La cantine ouvre la fenêtre repas (libère le verrou) et diffuse le message "le dîner est servi" (notifyAll). Tout le monde concourt pour faire la queue et attendre pour manger (BLOQUÉ). Chaque personne joue (RUNNABLE) dans la fenêtre de cuisson (obtient le verrou) à tour de rôle. Si vous voulez manger, terminez simplement le repas et partez (libérez le verrou). Si vous ne voulez pas manger, partez directement (libérez le verrou). Si vous voulez toujours manger après avoir mangé, prenez l'initiative d'attendre le prochain message « le dîner est prêt » (attendez).

La cantine prévient une personne de venir manger (notifier), et cette personne vient au guichet repas (obtient le cadenas) pour préparer le repas (RUNNABLE), et tout le monde attend la nouvelle de l'ouverture du repas (EN ATTENDANT). Si vous voulez manger, terminez simplement le repas et partez (libérez le verrou). Si vous ne voulez pas manger, partez directement (libérez le verrou). Si vous souhaitez toujours manger après avoir mangé, prenez l'initiative d'attendre le prochain message « dîner » (ATTENTE).
notify ne peut pas garantir d'avertir les personnes qui veulent vraiment manger.

Exemple 2 :

Deux producteurs P1 et P2, et deux consommateurs C1 et C2, exploitent conjointement une file d'attente d'une longueur de file d'attente maximale de 1.

Démarrez P1, P2, C1 et C2 en état d'exécution (RUNNABLE).

C1 obtient le verrou en premier, et P1, P2 et C2 sont à l'état BLOQUÉ. C1 constate que la file d'attente est vide et entre activement en ATTENTE. C2 obtient alors le verrou, passe à l'état RUNNABLE, constate que la file d'attente est vide et entre activement en ATTENTE.

P1 acquiert alors le verrou, passe à l'état RUNNABLE, insère un élément dans la file d'attente et informe un autre producteur P2. P1 produit en boucle et constate que la file d'attente n'est pas vide et devient WAITING.

P2 passe à l'état RUNNABLE, constate que la file d'attente a de la valeur et entre activement en ATTENTE.

À ce moment, le verrou a été libéré, mais P1, P2, C1 et C2 sont tous dans l'état WAITING. Il n'y a pas de thread pour acquérir le verrou et ils sont morts.

Articles associés :

Deux modes de collaboration entre les threads dans la concurrence Java : attendre, notifier, notifierTout et Condition

attendre, corriger utilisation de notify et notifyAll

Discutez de la différence essentielle entre notify() et notifyAll() à travers des exemples

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn