Comprendre la cohérence avant qu'elle se produise
Dans le chapitre 17 de la spécification du langage Java (JLS), la « cohérence qui se produit avant » est définie comme suit :
"Un ensemble d'actions A est cohérent avant tout si pour toutes les lectures r dans A, où W(r) est l'action d'écriture vue par r, il n'est pas vrai que hb(r , W(r)) ou qu'il existe une écriture w dans A telle que w.v = r.v et hb(W(r), w) et hb(w, r)."
Cette définition peut être simplifiée comme : pour qu'un ensemble d'actions soit cohérent avant, aucune lecture ne doit voir une écriture qui se produit plus tard, et aucune écriture ne doit être suivie d'une lecture qui voit une valeur antérieure.
Vos questions
Vos deux premières questions :
Votre troisième question :
Les chiffres à gauche des actions dans les ordres d'exécution représentent l'ordre séquentiel dans lequel les actions ont été exécutées.
Votre quatrième question :
Oui, votre compréhension selon laquelle r2 et r1 ont tous deux vu l'écriture initiale de 0 car A et B ne sont pas des champs volatils est correcte. Les champs non volatils peuvent être stockés dans des registres, ce qui peut entraîner des incohérences temporaires.
Vos cinquième et sixième questions :
La situation décrite dans le deuxième ordre d'exécution, où les lectures voient les écritures qui se produisent plus tard, peuvent se produire dans des scénarios multithread réels. Un exemple pourrait être :
Pour éviter de telles incohérences, des champs volatiles peuvent être utilisés pour garantir que les lectures et les écritures sont effectuées de manière cohérente.
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!