Kursinhalt
Multithreading in Java
Multithreading in Java
Atomarität
Inkrementalität und Atomizität
In diesem Code definieren wir eine Counter
-Klasse mit einer count
-Variable und einer increment-Methode, die den Wert der count
-Variable um 1 erhöht.
Main
public class Counter { int count; // Declare a variable public void increment() { // In this method we increment count++; } }
Es mag so erscheinen, als ob das Inkrementieren eine einzelne Operation ist, aber es besteht tatsächlich aus 3 Operationen:
Aber auf der Maschinenebene sind dies mehrere Operationen:
1. Lesen des count
-Wertes;
2. Erhöhen des Wertes um 1;
3. Schreiben des neuen Wertes zurück in count
.
Hinweis
Wenn mehrere Threads diese Operation gleichzeitig ohne Synchronisation ausführen, könnte das Ergebnis falsch sein, da ein Thread mit dem Inkrementieren beginnen könnte, während ein anderer Thread noch das Inkrement-Ergebnis in den Speicher schreibt. Dieses Problem ist als Race Conditions bekannt.
Wie vermeidet man Verstöße gegen die Atomarität?
Die folgenden Ansätze können Atomaritätsprobleme in der Multithread-Programmierung in Java adressieren:
Verwendung von Synchronisation: Synchronisation steuert den Zugriff auf gemeinsame Ressourcen durch die Verwendung des synchronized-Schlüsselworts, das auf Methoden oder Codeblöcke angewendet werden kann.
Verwendung von atomaren Klassen: Das java.util.concurrent.atomic
-Paket von Java bietet Klassen für atomare Operationen. Diese Klassen verwenden niedrigstufige Synchronisationsmechanismen wie CAS (Compare-And-Swap), um Atomarität ohne Sperren zu gewährleisten. (Wir werden diese Klassen später ausführlicher erkunden)
Verwendung von hochrangigen Klassen und Sammlungen: Java bietet hochrangige synchronisierte Datenstrukturen wie ConcurrentHashMap
und CopyOnWriteArrayList
, die sicheren Zugriff von mehreren Threads bieten. (Wir werden diese Klassen später ausführlicher überprüfen)
1. Welche der folgenden Ansätze helfen, die Atomarität von Operationen in Java sicherzustellen?
2. Warum ist die Inkrementoperation (Erhöhung eines Wertes um 1) in der Multithread-Programmierung nicht atomar?
Danke für Ihr Feedback!