Heim >Java >javaLernprogramm >Was ist ein Speichermodell und warum wird es benötigt?

Was ist ein Speichermodell und warum wird es benötigt?

零下一度
零下一度Original
2017-06-25 10:32:562199Durchsuche

JAVA-Speichermodell

In dieser Multithreading-Reihe werden wir nicht die unterste Ebene des Speichermodells untersuchen

Was ist das Speichermodell und warum wird es benötigt

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

wie folgt neu an: Es wird sehr schwierig sein, den Ausgabewert zu beurteilen

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

Partielle Ordnungsbeziehung: Antisymmetrie, Reflexivität und transitive Eigenschaften; aber für zwei beliebige Elemente A und B erfüllt es nicht unbedingt die Beziehung, dass A B oder B A bevorzugt

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 sein

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 {
    }
}
  

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn