Maison > Java > javaDidacticiel > Quand devriez-vous utiliser `notifyAll()` en Java ?

Quand devriez-vous utiliser `notifyAll()` en Java ?

Patricia Arquette
Libérer: 2024-11-19 10:20:03
original
913 Les gens l'ont consulté

When Should You Use `notifyAll()` in Java?

Java : notify() vs notifyAll() revisité

Bien qu'il soit souvent dit que notify() ne réveille qu'un seul thread en attente et notifyAll () réveille tous les threads en attente, il est crucial de comprendre leurs implications pratiques.

Différence fondamentale

Les deux méthodes réveillent les threads en attente, mais un seul thread se voit accorder l'acquisition du moniteur à la fois. temps, quelle que soit la méthode utilisée. Ce processus de sélection n'est pas déterministe et dépend de la VM ou du planificateur de threads du système sous-jacent.

La valeur de notifyAll()

Dans la plupart des scénarios, notifyAll() devrait être employé sur notify(). Lorsque notify() est utilisé, un seul thread peut être sélectionné à exécuter. Cela peut conduire à des blocages, comme le montre l'exemple suivant :

public class ProducerConsumerBroken {

    private Object[] buf;

    public synchronized void put(Object o) {
        while (buf.length == MAX_SIZE) wait();
        buf[next] = o;
        notify();
    }

    public synchronized Object get() {
        while (buf.length == 0) wait();
        return buf[next--];
    }
}
Copier après la connexion

Dans cet exemple, notify() peut entraîner un blocage car le planificateur de threads du système peut continuellement favoriser un thread, laissant les autres threads suspendus indéfiniment.

Évitement des blocages avec notifyAll()

En utilisant notifyAll(), tous les threads en attente (le cas échéant) sont réveillés, donnant à chaque thread une chance impartiale d'acquérir le verrou et continuez. Cela élimine la possibilité de blocages.

Quand utiliser notifyAll()

Utilisez notifyAll() chaque fois que vous souhaitez vous assurer que tous les threads en attente sont informés que l'objet qu'ils ce que j'attends a changé. Ceci est particulièrement important dans les cas où vous ne pouvez pas prédire quel thread doit être notifié ou lorsque plusieurs threads peuvent être en attente sur le même verrou.

Recommandation

En règle générale En règle générale, utilisez toujours notifyAll(). Cela évitera les blocages potentiels et garantira l’équité dans la planification des threads.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal