In dieser Multithreading-Reihe werden wir nicht die unterste Ebene des Speichermodells untersuchen
Bei modernen Multi-Core-Prozessoren verfügt jeder Prozessor über einen eigenen Cache, der regelmäßig mit dem Hauptspeicher abgestimmt wird
Wenn Sie sicherstellen möchten, dass jeder Prozessor jederzeit weiß, was andere Prozessoren tun Zeit, Sie benötigen viel Overhead und sind normalerweise unnötig.
Wir müssen die Informationen nur kennen, wenn wir Daten über Threads in JAVA austauschen müssen. Dies wird durch korrekte Synchronisierung erreicht > 1. Ordnen Sie
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. Einführung in den JAVA-Speicher Modell
Zum Beispiel: A und B Ich bevorzuge B, aber ich muss keine explizite Auswahl treffen
JMM definiert eine Teilordnungsbeziehung für alle Operationen im Programm, die „Happens-Before“ genannt wird, wenn Sie dies sicherstellen möchten dass Operation B ausgeführt wird. Wenn ein Thread das Ergebnis des Threads sieht, der Operation A ausführt, muss AB unabhängig davon, ob es sich im selben Thread befindet, die Happens-Before-Beziehung erfüllen, andernfalls ordnet die JVM es neu
Zum Beispiel: Mehrere Threads können die Ausführungsreihenfolge vorhersagen. Ohne Sperren ist es unmöglich, die Planung zwischen Threads zu beurteilen >
3. Veröffentlichen
Der wahre Grund: Aufgrund der Neuordnung besteht keine Happens-Before-Beziehung zwischen der Veröffentlichung eines gemeinsam genutzten Objekts und dem Zugriff auf das Objekt von Anweisungen wird das Objekt veröffentlicht, ohne korrekt konstruiert zu seinpublic 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 { } }
Das obige ist der detaillierte Inhalt vonWas ist ein Speichermodell und warum wird es benötigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!