php-Editor Xigua führt Sie eingehend in die Erkundung des Java-Speichermodells und der Sichtbarkeit ein und analysiert die Datenkonsistenzprobleme bei der Multithread-Programmierung. In einer Multithread-Umgebung ist die Datensichtbarkeit entscheidend für die Programmkorrektheit. Durch eine gründliche Analyse des Java-Speichermodells können wir den Mechanismus der Dateninteraktion bei der Multithread-Programmierung besser verstehen und so unerwartete Probleme vermeiden. In diesem Artikel werden wir Schlüsselthemen der Multithread-Programmierung diskutieren, um den Lesern zu helfen, die relevanten Kenntnisse des Java-Speichermodells besser zu verstehen und anzuwenden.
Sichtbarkeit bedeutet, dass Änderungen an gemeinsam genutzten Variablen durch einen Thread sofort für andere Threads sichtbar sind. In JMM wird die Sichtbarkeit durch Speicherbarrieren erreicht. Eine Speicherbarriere ist eine spezielle Anweisung, die die JVM dazu zwingt, den Cache vor oder nach der Durchführung von Speicheroperationen zu leeren.
public class VisibilityDemo { private int sharedVar = 0; public void writerThread() { sharedVar = 42; } public void readerThread() { int localVar = sharedVar; // 可能读取到旧值 System.out.println("Reader thread: " + localVar); } public static void main(String[] args) { VisibilityDemo demo = new VisibilityDemo(); Thread writer = new Thread(demo::writerThread); Thread reader = new Thread(demo::readerThread); writer.start(); reader.start(); writer.join(); reader.join(); } }
Im obigen Beispiel wird eine Speicherbarriere zwischen writerThread
和 readerThread
同时访问共享变量 sharedVar
。如果没有内存屏障,readerThread
可能会读取到旧的 sharedVar
值,导致程序输出错误的结果。为了解决这个问题,可以在 writerThread
和 readerThread
eingefügt.
public class VisibilityDemoWithMemoryBarrier { private int sharedVar = 0; public void writerThread() { // 插入内存屏障 synchronized (this) {} sharedVar = 42; } public void readerThread() { // 插入内存屏障 synchronized (this) {} int localVar = sharedVar; System.out.println("Reader thread: " + localVar); } public static void main(String[] args) { VisibilityDemoWithMemoryBarrier demo = new VisibilityDemoWithMemoryBarrier(); Thread writer = new Thread(demo::writerThread); Thread reader = new Thread(demo::readerThread); writer.start(); reader.start(); writer.join(); reader.join(); } }
Im obigen Beispiel haben wir writerThread
和 readerThread
之间插入了内存屏障(通过调用 synchronized
方法)。这样,readerThread
就能够立即看到 writerThread
对 sharedVar
geändert und es wird keine falschen Ergebnisse geben.
Atomizität bedeutet, dass eine Operation entweder vollständig oder gar nicht ausgeführt wird. In JMM wird Atomizität durch atomare Variablen und atomare Operationen (atomare Operation) erreicht. Atomic-Variable ist eine spezielle Variable, auf die nur ein Thread gleichzeitig zugreifen kann. Eine atomare Operation ist eine spezielle Operation, die ohne Unterbrechung ausgeführt werden kann.
import java.util.concurrent.atomic.AtomicInteger; public class AtomicityDemo { private AtomicInteger sharedVar = new AtomicInteger(0); public void incrementSharedVar() { sharedVar.incrementAndGet(); } public static void main(String[] args) { AtomicityDemo demo = new AtomicityDemo(); Thread[] threads = new Thread[10]; for (int i = 0; i < threads.length; i++) { threads[i] = new Thread(demo::incrementSharedVar); } for (Thread thread : threads) { thread.start(); } for (Thread thread : threads) { thread.join(); } System.out.println("Final value of sharedVar: " + demo.sharedVar.get()); } }
Im obigen Beispiel haben wir atomare Variablen verwendet
und das Endergebnis ist auch korrekt.
sharedVar
来确保多个线程对 sharedVar
的修改是原子的。即使有多个线程同时修改 sharedVar
Das obige ist der detaillierte Inhalt vonJava-Speichermodell und Sichtbarkeit: Ein genauerer Blick auf die Datenkonsistenz in der Multithread-Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!