Maison  >  Article  >  Java  >  Qu’est-ce qu’un modèle de mémoire et pourquoi est-il nécessaire ?

Qu’est-ce qu’un modèle de mémoire et pourquoi est-il nécessaire ?

零下一度
零下一度original
2017-06-25 10:32:562101parcourir

Modèle de mémoire JAVA

Dans cette série de multi-threading, nous n'explorerons pas la couche inférieure du modèle de mémoire

1 Qu'est-ce que le modèle de mémoire et pourquoi est-il nécessaire

. 🎜>

Dans les processeurs multicœurs modernes, chaque processeur possède son propre cache, qui est régulièrement coordonné avec la mémoire principale

Si vous voulez vous assurer que chaque processeur sait ce que font les autres processeurs à tout moment ; du temps, vous aurez besoin de beaucoup de temps système ; et est généralement inutile

Nous n'avons besoin de connaître les informations que lorsque nous devons partager des données entre les threads ; en JAVA, cela est réalisé grâce à une synchronisation correcte

1. Réordonnez

comme suit : Il sera très difficile de juger la valeur de sortie
public class PossibleReordering {static int x = 0, y = 0;static int a = 0, b = 0;/** * 判断输出值将会非常困难:
     * 1:多线程之间的切换,导致可能的输出值:(0,1)(1,0)(1,1)
     * 2.指令重排序:one线程如a=1和x=b之间重排序,x=b(0),然后other线程被调度执行y=a(0),将导致(0,0)     */public static void main(String[] args) throws InterruptedException {
        Thread one = new Thread(new Runnable() {public void run() {
                a = 1;
                x = b;
            }
        });
        Thread other = new Thread(new Runnable() {public void run() {
                b = 1;
                y = a;
            }
        });
        one.start();
        other.start();
        one.join();
        other.join();
        System.out.println("( " + x + "," + y + ")");
    }
}

2. Introduction à la mémoire JAVA modèle

Relation d'ordre partiel : anti-symétrie, réflexivité et propriétés transitives mais pour deux éléments A et B quelconques, elle ne satisfait pas nécessairement à la relation selon laquelle A favorise B ou B favorise A

Par exemple : A et B Je préfère B, mais je n'ai pas besoin de faire un choix explicite

JMM définit une relation d'ordre partiel pour toutes les opérations du programme, appelée Happens-Before si vous voulez vous assurer ; cette opération B est exécutée Lorsqu'un thread voit le résultat du thread qui effectue l'opération A, que AB soit ou non dans le même thread, il doit satisfaire la relation Happens-Before, sinon la JVM le réorganisera

Par exemple : l'opération de verrouillage peut prédire l'ordre d'exécution. Plusieurs threads sont conformes à Happens-Before. Sans verrouillage, il est impossible de juger la planification entre les threads

.

 3. Publier

La vraie raison : il n'y a pas de relation Happens-Before entre la publication d'un objet partagé et l'accès à l'objet dans un autre fil de discussion en raison de la réorganisation de ; instructions, l'objet est publié sans être construit correctement
public class UnsafeLazyInitialization {private static Resource resource;/** * 除了竟态条件问题检查后执行,还有不安全发布的问题
     * 如:一个线程A进来,看到resource为null,则实例化并返回;另一个线程B进来看到resource不为null直接返回
     * 如果在线程A中对resource进行了修改,则可能在线程B中看不到resource的正确状态     */public static Resource getInstance() {if (resource == null)
            resource = new Resource(); // unsafe publicationreturn resource;
    }static class Resource {
    }
}

  

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!

Déclaration:
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