Maison > Java > javaDidacticiel > le corps du texte

Qu'est-ce que la cohérence « arrive avant » en Java et comment fonctionne-t-elle ?

DDD
Libérer: 2024-10-31 16:41:30
original
453 Les gens l'ont consulté

What is

Comprendre la cohérence qui se produit avant

Le concept de cohérence qui se produit avant dans la spécification du langage Java (JLS) fait référence à l'ordre cohérent des lit et écrit dans un environnement multithread.

Définition de la cohérence avant l'arrivée

Un ensemble d'actions A est cohérent avant l'arrivée si, pour chaque lecture r dans A où W(r) est l'action d'écriture vue par r :

  • Soit hb(r, W(r)) (r s'est produit avant W(r))
  • Ou il n'existe pas d'écriture w dans A telle que w.v = r.v et à la fois hb(W(r), w) et hb(w, r) (il n'y a pas d'incohérence entre r et w)

Questions répondues

1. Votre compréhension est-elle correcte ?
Oui, votre compréhension est correcte. "Cela équivaut aux mots suivants : ..., il est vrai que ni ... ni..." n'est un équivalent logique de la définition formelle.

2. Que signifie "w.v = r.v" ?
w.v et r.v font référence aux valeurs de la variable accédées par l'écriture w et la lecture r, respectivement. La condition w.v = r.v signifie que les valeurs lues dans les deux actions sont les mêmes.

3. Que représentent les chiffres de gauche dans les ordres d'exécution ?
Les chiffres de gauche représentent l'ordre des actions dans le code d'origine.

4. Votre compréhension des champs volatils est-elle correcte ?
Oui, votre compréhension est correcte. Dans le premier ordre d'exécution, r2 et r1 voient tous deux l'écriture initiale de 0 car A et B sont des champs non volatils, permettant des lectures retardées ou incohérentes.

5. La situation (les lectures voir les écritures qui se produisent plus tard) existe-t-elle dans le monde réel ?
Oui, elle peut exister. Un exemple est lorsque deux threads accèdent aux données partagées via leurs propres registres et que les optimisations empêchent le thread de lecture de détecter la modification apportée par le thread d'écriture.

6. Pourriez-vous donner un exemple réel ?
Considérons l'exemple suivant :

Thread 1

<code class="java">volatile boolean running = true;</code>
Copier après la connexion

Thread 2

<code class="java">while (running) {
  // Perform task
}</code>
Copier après la connexion

Dans cet exemple, si l'optimisation du thread de lecture l'empêche de charger la valeur mise à jour de running, il continuera à voir la valeur obsolète et exécutera la boucle indéfiniment, même si le thread 1 a déjà défini running sur faux.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal