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--]; } }
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!