Grundlegendes zur Java-Parallelverarbeitung (Einführung)

Haben Sie beispielsweise die folgenden Punkte im Hinblick auf die Parallelverarbeitung implementiert?

Wenn Sie diesen Code ohne Rücksicht implementieren, ** kann dies zu lächerlichen Fehlern in Ihrem Produktionssystem führen. ** **.

In diesem Artikel möchte ich die Parallelverarbeitung gemäß dem folgenden Ablauf erläutern.

Was ist "Parallelverarbeitung"?

Lassen Sie uns zunächst verstehen, wie Java im Speicher funktioniert.

"Prozess" und "Thread"

Verschiedene Daten zum Ausführen von Programmen werden im Speicher gespeichert. Der Speicherplatz wird nicht zwischen Prozessen geteilt, aber der Speicherplatz wird zwischen Threads geteilt. Das heißt, ** verschiedene Threads können auf dieselben Daten zugreifen. ** **.

Arten der Thread-Verarbeitung

Unter diesen entsprechen Parallelverarbeitung und Parallelverarbeitung einem "Multithread", der mehrere Threads gleichzeitig verarbeitet. Andererseits wird die sequentielle Verarbeitung als "einzelner Thread" bezeichnet, da Threads einzeln verarbeitet werden.

Was Sie beachten müssen, ist ** Parallelverarbeitung **. Da sich mehrere Threads den Speicherplatz teilen, können die von einem Thread gelesenen und geschriebenen Daten von dem anderen Thread gelesen und geschrieben werden, wenn Threads gleichzeitig ausgeführt werden.

リソースへの同時アクセス

[IPA ISEC Secure Programming-Kurs: C / C ++ - Sprachausgabe Kapitel 4 Gegenmaßnahmen für unvorhergesehene Situationen: Allgemeine Gegenmaßnahmen für Rennbedingungen](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents /c304.html)

Warum sollte Parallelität berücksichtigt werden?

Schauen wir uns den Grund an, warum die parallele Verarbeitung anhand eines Beispiels betrachtet werden sollte.

Angenommen, Sie haben das folgende Reservierungssystem für Bibliotheksmieten. Zu diesem Zeitpunkt wird angenommen, dass die Anzahl der Reservierungen für das Buch "Java Parallel Processing Programming" zu diesem Zeitpunkt 0 ist.

  1. Holen Sie sich die Anzahl der Reservierungen
  2. Addieren Sie 1 zur Anzahl der erhaltenen Reservierungen
  3. Verarbeiten Sie die Anzahl der gebuchten Personen. 2. Aktualisieren Sie mit dem Wert in 2.

Was ist, wenn Alice und Bob gleichzeitig "Java Concurrency Programming" buchen? Abhängig vom Zeitpunkt kann die Verarbeitung in der folgenden Reihenfolge ausgeführt werden.

Alice und Bob, die beide glauben, früher als alle anderen gebucht zu haben, besuchten am nächsten Tag die Bibliothek und gerieten in einen Streit.

Wie im obigen Beispiel wird ein Fehler, der auftritt, wenn auf Daten, auf die nicht gleichzeitig zugegriffen werden sollte, tatsächlich parallel von mehreren Threads aus zugegriffen wird ** "Race-Bedingung" Es wird genannt "**". Der Bereich, der in einem Programm in einem einzelnen Thread betrieben werden muss, wird als "kritischer Abschnitt" bezeichnet.

Andererseits wird ein Programm, das normal funktioniert, auch wenn es von mehreren Threads gleichzeitig aufgerufen wird, als ** "thread-sicher" ** bezeichnet.

Thread-sichere und nicht thread-sichere Variablen

In Java sind einige Variablen threadsicher und andere nicht. Ich möchte erklären, wie diese Variablen im Speicher funktionieren.

Variablentyp

public class ClassSample{

	private String foo; //Instanzvariable
	private static String bar; //Klassenvariable

	public static void methodSample(){
		
		int num = 1; //Lokale Variablen
		
	}
}

Von diesen Variablen sind ** nur lokale Variablen ** threadsicher **.

Thread-sichere Variablen

Lokale Variablen sind für jeden Thread eindeutig und können nur von einem Thread aufgerufen werden, da die Daten in einem Bereich im Speicherbereich gespeichert sind, der als "Stapelbereich" ** bezeichnet wird. Daher schreiben andere Threads die Informationen nicht neu oder verweisen fälschlicherweise auf die Informationen.

Variablen, die nicht threadsicher sind

Instanzvariablen und Klassenvariablen werden von mehreren Threads gemeinsam genutzt ** Da sich Daten in einem Bereich im Speicherbereich befinden, der als "Heap-Bereich" bezeichnet wird **, können andere Threads die Informationen neu schreiben oder versehentlich auf die Informationen verweisen. Ich kann es tun.

ローカル変数以外は複数のスレッドから共有され得る

[Implementierung] Vergessen Sie nicht, es threadsicher zu machen | Nikkei xTECH (Cross Tech)

Beachten Sie auch die ** JSP <%!%> Tags, die beim Deklarieren von Variablen und Methoden verwendet werden. Das Tag ** <%!%> Ist nicht threadsicher, da es beim Kompilieren der JSP als Servlet ** -Instanzvariable ** erweitert wird.

Die parallele Verarbeitung ist schwer zu testen

Rennbedingungen sind Zeitfehler, die in ** Tests sehr schwer zu erkennen sind. ** **.

Brian Goetz (Java Architect, Oracle, Stand März 2018), ein führender Experte für Java-Parallelverarbeitung, schrieb einen Artikel über Parallelverarbeitung. In "Java-Theorie und -Praxis: Sicherlich Fehler töten" Wird als erwähnt.

Es überrascht nicht, dass das Schreiben von Code der beste Zeitpunkt ist, um Ihren Code von hoher Qualität zu erstellen. Dies liegt daran, dass ich das beste Verständnis dafür habe, was zu diesem Zeitpunkt funktioniert und wie es funktioniert.

** Um die Rennbedingungen nicht einzubetten, sollte es von einem Programmierer programmiert und überprüft werden, der Parallelität versteht **.

Der Artikel empfiehlt "Fehler suchen" als teilweise, aber effektives Tool zum Erkennen von Parallelitätsfehlern. "Spotbugs", der Nachfolger von "FindBugs", verfügt über mehrere Elemente zur Erkennung von Rennbedingungen. ("SpotBugs-Handbuch, Details zu erkennbaren Fehlern")

Facebook hat im Oktober 2017 auch ** "RacerD" **, ein statisches Analysetool für Java-Parallelitätsfehler, als Open Source veröffentlicht. Bitte schauen Sie, wie es im folgenden Artikel vorgestellt wird.

Ich habe das Java-Parallelitäts-Fehleranalysetool "RacerD" von Facebook - Qiita ausprobiert

Zusammenfassung

Nachschlagewerk

Referenz-Website

Recommended Posts

Grundlegendes zur Java-Parallelverarbeitung (Einführung)
[Java] Einführung
Serververarbeitung mit Java (Einführung Teil.1)
Java-Thread-Verarbeitung
Java-String-Verarbeitung
Einführung in Java
[Java] Multithread-Verarbeitung
[Java] Stream-Verarbeitung
Java iterativer Prozess
Java-Leistung Kapitel 1 Einführung
JAVA-Konstruktoraufrufverarbeitung
Einführung in den Java-Befehl
Java zufällig, verschiedene Verarbeitung
[Java] Multithread-Verarbeitung - Exklusive Steuerung
[Java] Anfängerverständnis von Servlet-②
[Java] Anfängerverständnis von Servlet-①
[Java] Einführung in den Lambda-Ausdruck
[Java] Stream API - Stream-Beendigungsverarbeitung
[Java] Stream API - Stream Zwischenverarbeitung
[Java] Implementierungsmethode für die Timer-Verarbeitung
Gemessene Parallelverarbeitung mit Java
[Java] Einführung in die Stream-API
Zusammenfassung der Java-Fehlerverarbeitung
[Einführung in Janken (ähnliche) Spiele] Java
100% reines Java BDD mit JGiven (Einführung)
[Einführung in Java] Über Lambda-Ausdrücke
[Einführung in Java] Informationen zur Stream-API
Datumsverarbeitung in Java (LocalDate: Initialisierung)
Delegieren Sie Java-Verarbeitung an JavaScript
[Java] Schleifenverarbeitung und Tabelle von neunundneunzig
Verwenden wir Twilio in Java! (Einführung)
Einführung in die funktionale Programmierung (Java, Javascript)
Führen Sie node.js von Android Java aus (Verarbeitung)
[Verarbeitung × Java] Verwendung von Variablen
[Java] Was ist die Ausnahme für gleichzeitige Änderungen?
Verstehe gleich und hashCode in Java
Überraschend tiefe Java-Liste Inversion-Stream-Verarbeitung
Grundlegender Verarbeitungsablauf von Java Stream
Informationen zur Dateikopierverarbeitung in Java
Schrittweises Verständnis der Behandlung von Java-Ausnahmen
Löschen von Dateien mit rekursiver Verarbeitung [Java]
[Verarbeitung × Java] Verwendung von Arrays
[Java] Memo zur Verarbeitungszeitmessmethode
[Java] Ausnahmetypen und grundlegende Verarbeitung
[Einführung in Java] Informationen zur iterativen Verarbeitung (while, do-while, for, Erweiterung für, break, continue)