Dans cette série de multi-threading, nous n'explorerons pas la couche inférieure du modèle de mémoire
. 🎜>
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 sortiepublic 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 + ")"); } }
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 correctementpublic 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!