Ich habe dieses einfache Java-Programm geschrieben:
%Vor%Dies erzeugt den folgenden disassemblierten Code für i ++ und j ++ (verbleibender disassemblierter Code entfernt):
%Vor%Das verstehe ich über den folgenden Assembler-Code:
JMM gibt an, dass vor jedem flüchtigen Lesen eine Ladespeicherbarriere vorhanden sein muss und nach jedem flüchtigen Schreibvorgang eine Speicherschranke vorhanden sein muss. Meine Frage ist:
Daher sind alle Sperren StoreStore, LoadLoad, LoadStore auf x86 nicht aktiv. Außer StoreLoad, das über mfence oder cpuid oder locked insn realisiert werden kann. Was Sie bereits mit Ihrem Assembler-Code bestätigen können. Andere Barrieren bedeuten nur eine Einschränkung der Compiler-Optimierung und -Transformation, so dass sie java nicht brechen Speichermodellspezifikation .
Als du auf dem Intel Prozessor liefest, nehme ich sein x86 an.
Bitte lesen Sie
Lock ist kein Befehl, sondern ein Befehlspräfix (verhält sich wie eine storeLoad-Barriere).
volatile
Schlüsselwort in Java garantiert nur, dass die lokalen Threadskopien und Caches übersprungen werden und der Wert direkt vom Hauptspeicher geladen oder in den Hauptspeicher geschrieben wird. Es enthält jedoch keinen Sperrmechanismus. Das Lesen von volatile
oder das Schreiben in volatile
ist also atomar, aber eine Reihe von Lese- und Schreibvorgängen, wie Ihre obigen
j++
ist NICHT atomar, weil ein anderer Thread den Wert von j
zwischen dem Lesen und Schreiben in die Variable im Hauptspeicher ändern kann. Um atomare Inkremente zu erreichen, müssen Sie CAS-Operationen verwenden, die in atomare Klassen in Java eingeschlossen sind, wie AtomicInteger
usw. Alternativ können Sie atomare Methoden in Unsafe
klasse zB verwenden, wenn Sie eine Low-Level-Programmierung bevorzugen. Unsafe.compareAndSwapInt
etc.
Die Barriere kann von Ihrem JIT-Compiler optimiert werden, da Ihr Programm single-threaded ist (es gibt nur einen Thread - den Hauptthread), genauso wie eine Sperre unter einer single-threaded-Umgebung optimiert werden kann. Diese Optimierung ist unabhängig von der Prozessorarchitektur.
Tags und Links java multithreading assembly intel