Heim  >  Artikel  >  Java  >  Teilen Sie einige Probleme mit der Multithread-Parallelität

Teilen Sie einige Probleme mit der Multithread-Parallelität

零下一度
零下一度Original
2017-06-28 09:13:081480Durchsuche

Eine Übersicht

1.volatile

stellt sicher, dass die freigegebenen Daten sofort synchronisiert werden, sobald sie geändert werden der gemeinsame Speicher (Heap oder Methodenbereich).

2. Der Prozess des Thread-Zugriffs auf Daten im Heap

Der Thread erstellt eine Kopie der Variablen im Stapel und synchronisiert die Daten auf den Stapel.

3. Neuordnung der Befehle

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.

Zwei häufige Probleme und Lösungen

1. Atomizitätsproblem

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

Sichtbarkeitsprobleme treten im Zusammenhang mit der Art und Weise auf, wie Threads auf freigegebene Daten zugreifen. Wenn ein Thread auf eine Variable im Heap (Methodenbereich) zugreift, erstellt er zunächst eine

-Kopie der Variablen im Stapel und synchronisiert sie nach der Änderung mit dem Heap. Wenn ein Thread gerade eine Kopie erstellt hat und ein anderer Thread die Variable ändert, die noch nicht mit dem Heap synchronisiert wurde,

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

hat die Daten vom Heap kopiert, bevor der Vorgang abgeschlossen ist. Die geänderten Daten werden nicht mit dem aktuellen Thread synchronisiert.

3. Ordnungsprobleme

Um die Ausführungseffizienz zu verbessern, ordnet die CPU Anweisungen ohne Abhängigkeiten neu ist dasselbe wie das sequentielle Ausführungsergebnis.

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:

Thread B:
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:

  1. Verwenden Sie den Synchronisierungsmechanismus, sodass nur ein Thread gleichzeitig auf die freigegebenen Daten zugreifen kann , was ineffizient ist.

  2. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn