Haben Sie beispielsweise die folgenden Punkte im Hinblick auf die Parallelverarbeitung implementiert?
++
) und Dekrementieren (-
)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.
Lassen Sie uns zunächst verstehen, wie Java im Speicher funktioniert.
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. ** **.
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)
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.
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.
In Java sind einige Variablen threadsicher und andere nicht. Ich möchte erklären, wie diese Variablen im Speicher funktionieren.
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 **.
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.
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.
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
<%!%>
Tags sind ** nicht threadsicher. ** **.Recommended Posts