Manchmal unterscheidet sich die Optimierung von Compilern und Prozessoren von der Laufzeit von dem, was wir uns vorgestellt haben. Aus diesem Grund hat Java Compilern und Prozessoren einige Einschränkungen auferlegt. Das JMMA -Speichermodell (JMM) ist diese heraus, damit beim Schreiben von Code keine so viele zugrunde liegende Details berücksichtigt werden müssen, und stellt sicher, dass "das Auslaufergebnis korrekt sein muss, solange Sie die JMM -Regeln befolgen, um ein Programm zu schreiben, das Auslaufergebnis sein muss."
Abstrakte Struktur von JMM
In Java werden alle Instanzen und statischen Variablen im Heap -Speicher gespeichert, das zwischen Threads geteilt werden kann, und dieser Teil wird auch als gemeinsam genutzte Variablen bezeichnet. Lokale Variablen, Methodendefinitionsparameter und Ausnahmeregelungsparameter liegen auf dem Stapel, und der Stapelspeicher wird nicht zwischen Threads geteilt.
Aufgrund der Optimierung von Compiler und Prozessor wird jedoch Sichtbarkeitsprobleme mit gemeinsamen Variablen auftreten. Beispielsweise können bei Multi-Prozessoren Threads auf verschiedenen Prozessoren ausgeführt werden, und der Cache-inkonsistent zwischen Prozessoren verursacht Sichtbarkeitsprobleme mit gemeinsamen Variablen . Es ist möglich, dass zwei Threads unterschiedliche Werte derselben Variablen sehen.
JMM Zusammenfassung Die Optimierungen, die diese Hardware in diesen Thread vorgenommen haben, hat einen lokalen Speicher. Wenn Sie gemeinsam genutzte Variablen lesen und schreiben müssen, kopieren Sie eine Kopie aus dem Hauptspeicher in den lokalen Speicher. Schreiben Sie beim Schreiben gemeinsamer Variablen sie zuerst in die lokale Erinnerung und aktualisieren Sie sie dann in Zukunft zum Hauptgedächtnis. Wenn die gemeinsam genutzte Variable erneut gelesen wird, wird sie nur aus dem lokalen Speicher gelesen.
Auf diese Weise erfordert die Kommunikation zwischen Threads zwei Schritte:
Thread schreiben: Aktualisieren Sie den lokalen Speicher und lesen Sie den Thread: Lesen Sie den aktualisierten Wert aus dem Hauptspeicher
Auf diese Weise gibt es eine Verzögerung zwischen Schreiben und Lesen: Wann wird die lokale Erinnerung an das Hauptspeicher aktualisiert? Dies führt zu Sichtbarkeitsproblemen, und unterschiedliche Threads können unterschiedliche gemeinsam genutzte Variablen sehen.
passiert-vor
Bist Dies ist die Regel, die Java in der Reihenfolge der Programmausführung formuliert und die Synchronisation befolgt werden muss. Auf diese Weise müssen Programmierer nur das richtige Synchronprogramm schreiben und vorhanden sicherstellen, dass die laufenden Ergebnisse nicht falsch sind.
A passiert vor B nicht nur, dass A vor B ausgeführt wird, sondern auch, dass die Ausführung von A für B sichtbar ist, was die Sichtbarkeit gewährleistet.
A passiert vor B und muss nicht vor B ausgeführt werden. Wenn AB wechseln und die Ausführungsergebnisse noch korrekt sind, dürfen der Compiler und der Prozessor die Neuordnung optimieren. Solange die Programmergebnisse korrekt sind, gibt es kein Problem damit, wie der Compiler und der Prozessor es optimieren und neu ordnen, und alles ist gut.
passiert vore Regeln
Programmsequenzregeln: In einem Thread ist die Betriebssperrregeln nach dem vorherigen Vorgang vor Ort: Bei derselben Sperre treue und sperren die volatilen Domänenregeln: Schreiben Sie die flüchtige Variable und lesen Sie eine der volatilen Variablen nach dem Voraus. Transitivität der Operation: A passiert vor B, B passiert vor C, dann ist ein passiert, bevor C start () Regeln () Regeln: Wenn Thread A ausgeführt wird, fadenstart (), dann thread.
Das folgende Beispiel hilft zu verstehen, dass es vor Ort ist
doppelt pi = 3,14; // adouble r = 1,0; // BDouble Area = pi * r * r; //C
Hier sind drei Haftbeziehungen, und die Regeln 1 und 2 sind Programmordnungsregeln, und die Regeln 3 werden aus transitiven Regeln abgeleitet:
Ein passiert-bevor BB vorkommt-vor Ca passiert-vor C.
C hängt von A und B ab, aber weder A noch B hängen davon ab. Selbst wenn A und B neu angeordnet sind, ändert sich die Ausführungsergebnisse nicht. Bei dieser Neuordnung läuft JMM.
Die folgenden zwei Ausführungssequenzen sind korrekt.
Das obige ist der gesamte Inhalt, den wir für Sie zum Erlernen des Java -Speichermodells JMM erstellt haben. Für weitere Fragen überlassen Sie bitte eine Nachricht, um zu diskutieren. Vielen Dank für Ihre Unterstützung für Wulin.com.