In Java ist der i-Operator nicht atomar, was bedeutet, dass, wenn zwei Threads gleichzeitig versuchen, dieselbe Variable zu erhöhen, der Das Ergebnis ist möglicherweise falsch. Dies liegt daran, dass die i-Operation aus drei separaten Schritten besteht:
Wenn zwei Threads diese Schritte gleichzeitig ausführen, ist es möglich, dass ein Thread den Wert liest, bevor der andere Thread inkrementiert hat Es. Dies kann zu Datenbeschädigungen führen.
Betrachten Sie beispielsweise den folgenden Code:
class Test { private static int total = 0; public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println("Total: " + total); } }
Wenn dieser Code ausgeführt wird, wird erwartet, dass er 200000 ausgibt, es kann jedoch tatsächlich sein, dass er einen niedrigeren Wert ausgibt Wert aufgrund der nicht-atomaren Natur des i-Operators.
Um sicherzustellen, dass Multithread-Code atomar auf gemeinsam genutzte Variablen zugreift, ist die Verwendung der Synchronisierung erforderlich Mechanismen wie Sperren oder atomare Variablen. Das synchronisierte Schlüsselwort kann verwendet werden, um den Zugriff auf Codeblöcke zu synchronisieren, während die AtomicInteger-Klasse einen atomaren Ganzzahltyp bereitstellt.
Das obige ist der detaillierte Inhalt vonWarum ist „i' in Java nicht atomar?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!