Heim >Java >javaLernprogramm >Teilen Sie einige Probleme mit der Multithread-Parallelität
Eine Übersicht
stellt sicher, dass die freigegebenen Daten sofort synchronisiert werden, sobald sie geändert werden der gemeinsame Speicher (Heap oder Methodenbereich).
Der Thread erstellt eine Kopie der Variablen im Stapel und synchronisiert die Daten auf den Stapel.
Um die Ausführungseffizienz zu verbessern, ordnet die CPU die Befehle ohne Abhängigkeiten neu. Wenn Sie die Neuordnung steuern möchten, können Sie flüchtig verwenden, um eine Variable zu ändern. Die Anweisungen vor und nach der Anweisung, die die Variable enthält, werden unabhängig voneinander sortiert, und die Anweisungen davor und danach können nicht kreuzweise angeordnet werden.
Die sogenannte Atomizität , Dies bedeutet, dass ein Vorgang nicht unterbrochen werden kann, d. h. in einer Umgebung mit mehreren Threads und gleichzeitigem Betrieb wird ein Vorgang, sobald er gestartet wird, innerhalb derselben CPU-Zeitscheibe ausgeführt . Wenn mehrere Vorgänge desselben Threads in unterschiedlichen CPU-Zeitscheiben ausgeführt werden, können aufgrund der Stagnation in der Mitte einige gemeinsam genutzte Daten während nachfolgender Vorgänge von anderen Threads geändert werden, und die Änderung wird nicht mit dem aktuellen Thread synchronisiert, was zu Datenverlust führt Wird vom aktuellen Thread betrieben und stimmt nicht mit den tatsächlichen Daten überein. Dieses durch inkohärente Ausführung verursachte Dateninkonsistenzproblem wird als Atomizitätsproblem bezeichnet. 2. Sichtbarkeitsprobleme
dann tritt ein Phänomen auf, bei dem zwei Threads dieselbe Variable im selben Zustand bearbeiten. Zum Beispiel i=9, der Anfangswert der Variablen i ist 9 und die Operation jedes Threads besteht darin, 1 zu subtrahieren. Zwei Threads A und B greifen zuerst auf Variablen B zu, bevor sie das Ergebnis i=8 mit dem Heap synchronisieren. Zu diesem Zeitpunkt wird auch der Status von i=9 ausgeführt Zweimal traten Thread-Sicherheitsprobleme auf. Gründe für Thread-Sicherheitsprobleme: Änderungen an gemeinsam genutzten Daten durch einen Thread können von anderen Threads nicht sofort gesehen werden.
volatile bietet eine Lösung:
Sobald ein Thread die von Volatile geänderten gemeinsam genutzten Daten ändert, wird die Änderung sofort mit dem Heap synchronisiert, sodass wann Andere Daten greifen vom Heap auf die freigegebenen Daten zu und erhalten in mehreren Threads immer den neuesten Wert.
Fehler von volatile:
volatile kann nur garantieren, dass ein Thread, wenn er Daten vom Heap erhält, den neuesten Wert unter allen aktuellen Threads erhält Ein Thread
3. Ordnungsprobleme
Zum Beispiel im Quellcode:
int i=0;
int y=1;
Während der Ausführung führt die CPU möglicherweise zuerst „int y=1;“ und dann „int i=0;“ aus.
Die Neuanordnung von Anweisungen ist in einer Single-Thread-Umgebung sicher, in einer Multi-Thread-Umgebung können jedoch Probleme auftreten. Zum Beispiel:
Thread A:
s=new String("sssss");//指令1flag=false;//指令2
Wenn Thread A sequentiell ausgeführt wird, also Anweisung 1 ausführt und dann Anweisung 2 ausführt, tritt bei der Ausführung von Thread B kein Problem auf. Nachdem die Anweisungen neu angeordnet wurden und Thread A zuerst Anweisung 2 ausführt,
Dies ist flag = true, wechselt zu Thread 2, beendet die Schleife und führt Anweisung 3 aus. Da das s-Objekt nicht ausgeführt wurde noch nicht erstellt wurde, wird ein Nullzeiger angezeigt.
Gründe für das Bestellproblem:
Ein Thread hat sequentielle Anforderungen für die Änderungsvorgänge anderer Threads an gemeinsam genutzten Daten. Thread B erfordert beispielsweise Thread A Führen Sie zuerst die Anweisung 1 aus, und dann die Anweisung 2. Aufgrund der Neuanordnung der Anweisungen werden die Anweisungen tatsächlich nicht in der erforderlichen Reihenfolge ausgeführt. Zu diesem Zeitpunkt treten Thread-Sicherheitsprobleme auf.
Lösung:
Verwenden Sie den Synchronisierungsmechanismus, sodass nur ein Thread gleichzeitig auf die freigegebenen Daten zugreifen kann , was ineffizient ist.
Bei Verwendung von Volatilität enthält eine Anweisung flüchtig modifizierte Variablen, dann bleibt die Ausführungsreihenfolge dieser Anweisung unverändert und die Anweisungen vor und nach dieser Anweisung können unabhängig sein Umordnen, Kreuzumordnen ist nicht möglich.
Referenz:
Das obige ist der detaillierte Inhalt vonTeilen Sie einige Probleme mit der Multithread-Parallelität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!