Java Language Des relations heureuses


Exemple

(Ce qui suit est une version simplifiée de ce que dit Java Language Specification. Pour une compréhension plus approfondie, vous devez lire la spécification elle-même.)

Les relations heureuses sont la partie du modèle de mémoire qui nous permet de comprendre et de raisonner sur la visibilité de la mémoire. Comme le dit le JLS ( JLS 17.4.5 ):

"Deux actions peuvent être ordonnées par une relation avant- passé. Si une action se produit avant une autre, la première est visible et ordonnée avant la seconde."

Qu'est-ce que ça veut dire?

actes

Les actions auxquelles la citation ci-dessus fait référence sont spécifiées dans JLS 17.4.2 . Il y a 5 types d'action énumérés par la spécification:

  • Lecture: lecture d'une variable non volatile.

  • Écrire: écrire une variable non volatile.

  • Actions de synchronisation:

    • Lecture volatile: Lecture d'une variable volatile.

    • Écriture volatile: écriture d'une variable volatile.

    • Fermer à clé. Verrouiller un moniteur

    • Ouvrir. Déverrouiller un moniteur.

    • Les premières et dernières actions (synthétiques) d'un thread.

    • Actions qui démarrent un thread ou détectent la fin d'un thread.

  • Actions externes Une action qui a un résultat qui dépend de l'environnement dans lequel le programme.

  • Actions de divergence de threads. Ils modélisent le comportement de certains types de boucle infinie.

Ordre de programme et ordre de synchronisation

Ces deux ordres ( JLS 17.4.3 et JLS 17.4.4 ) régissent l’exécution des instructions dans un Java

L'ordre des programmes décrit l'ordre d'exécution des instructions dans un seul thread.

L'ordre de synchronisation décrit l'ordre d'exécution des instructions pour deux instructions connectées par une synchronisation:

  • Une action de déverrouillage sur le moniteur se synchronise avec toutes les actions de verrouillage ultérieures sur ce moniteur.

  • Une écriture dans une variable volatile se synchronise avec toutes les lectures ultérieures de la même variable par n'importe quel thread.

  • Une action qui lance un thread (c'est-à-dire l'appel à Thread.start() ) se synchronise avec la première action du thread qu'il démarre (c'est-à-dire l'appel à la méthode run() du thread).

  • L'initialisation par défaut des champs se synchronise avec la première action de chaque thread. (Voir le JLS pour une explication à ce sujet.)

  • L'action finale dans un thread se synchronise avec toute action dans un autre thread qui détecte la terminaison; Par exemple, le retour d'un appel join() ou d'un appel isTerminated() qui renvoie true .

  • Si un thread interrompt un autre thread, l'appel d'interruption dans le premier thread se synchronise avec le point où un autre thread détecte que le thread a été interrompu.

Happens-before Order

Cet ordre ( JLS 17.4.5 ) est ce qui détermine si une écriture en mémoire est garantie d'être visible pour une lecture de mémoire ultérieure.

Plus précisément, une lecture d'une variable v garantit une écriture dans v si et seulement si write(v) se produit avant read(v) ET il n'y a pas d'écriture intermédiaire dans v . S'il y a des écritures intermédiaires, alors la read(v) peut voir les résultats plutôt que la précédente.

Les règles qui définissent les événements avant la commande sont les suivantes:

  • Règle Happens-Before # 1 - Si x et y sont des actions du même thread et que x arrive avant y dans l'ordre du programme , alors x se produit avant y.

  • Règle Happens-Before # 2 - Il y a un bord de passe avant de la fin d'un constructeur d'un objet au début d'un finaliseur pour cet objet.

  • Règle Happens-Before # 3 - Si une action x se synchronise avec une action ultérieure y, alors x se produit avant y.

  • Happens-Before Rule # 4 - Si x arrive -avant y et y se produit -avant z alors x arrive-avant z.

De plus, diverses classes dans les bibliothèques standard Java sont spécifiées comme définissant les relations avant-terme . Vous pouvez interpréter cela comme signifiant que cela se produit en quelque sorte , sans avoir besoin de savoir exactement comment la garantie va être satisfaite.