Comprendre le traitement parallèle Java (Introduction)

Par exemple, avez-vous implémenté les points suivants en tenant compte du traitement parallèle?

Si vous implémentez ce code sans aucune considération, ** cela peut provoquer des bogues ridicules dans votre système de production. ** **

Dans cet article, je voudrais expliquer le traitement parallèle selon le flux suivant.

Qu'est-ce que le "traitement parallèle"?

Tout d'abord, comprenons comment Java fonctionne en mémoire.

"Process" et "Thread"

Diverses données pour exécuter des programmes sont stockées dans l'espace mémoire. L'espace mémoire n'est pas partagé entre les processus, mais l'espace mémoire est partagé entre les threads. Autrement dit, ** différents threads peuvent accéder aux mêmes données. ** **

Types de traitement des threads

Parmi ceux-ci, le traitement parallèle et le traitement parallèle correspondent au «multi-thread» qui traite plusieurs threads en même temps. D'autre part, le traitement séquentiel est appelé "thread unique" car il traite les threads un par un.

Une chose à surveiller est le ** traitement parallèle **. Étant donné que plusieurs threads partagent de l'espace mémoire les uns avec les autres, si les threads sont exécutés en même temps, les données lues et écrites par un thread peuvent être lues et écrites par l'autre thread.

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

[Cours de programmation sécurisée IPA ISEC: C / C ++ Language Edition Chapitre 4 Contre-mesures pour les situations imprévues: contre-mesures générales pour les conditions de course](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents /c304.html)

Pourquoi la concurrence doit être envisagée

Regardons la raison pour laquelle le traitement parallèle doit être considéré à travers un exemple.

Par exemple, supposons que vous disposez du système de réservation de location de bibliothèque suivant. À ce stade, le nombre de réservations pour le livre "Java Parallel Processing Programming" est supposé être de 0 à ce moment.

  1. Obtenez le nombre de réservations
  2. Ajoutez 1 au nombre de réservations obtenues
  3. Traitez le nombre de personnes réservées 2. Mettez à jour avec la valeur en 2.

Et si Alice et Bob réservaient "Java Concurrency Programming" en même temps? En fonction du moment choisi, le traitement peut être exécuté dans l'ordre suivant.

Alice et Bob, qui croient tous deux avoir réservé plus tôt que quiconque, ont visité la bibliothèque le lendemain et se sont disputés.

Comme dans l'exemple ci-dessus, un bogue qui se produit lorsque des données qui n'étaient pas censées être accédées en même temps sont en fait accédées en parallèle à partir de plusieurs threads ** "Condition de course" On l'appelle "**". La plage qui doit être exploitée dans un seul thread dans un programme est appelée ** "section critique" **.

D'un autre côté, un programme qui fonctionne normalement même s'il est appelé à partir de plusieurs threads en même temps est appelé ** "thread safe" **.

Variables thread-safe et non thread-safe

En Java, certaines variables sont thread-safe et d'autres non. Je voudrais expliquer comment ces variables fonctionnent en mémoire.

Type de variable

public class ClassSample{

	private String foo; //Variable d'instance
	private static String bar; //Variable de classe

	public static void methodSample(){
		
		int num = 1; //Variables locales
		
	}
}

Parmi ces variables, ** seules les variables locales sont ** thread-safe **.

Variables thread-safe

Les variables locales sont uniques à chaque thread et ne sont accessibles que par un seul thread car les données sont stockées dans une zone de l'espace mémoire appelée ** "zone de pile" **. Par conséquent, les autres threads ne réécrivent pas les informations ou se réfèrent par erreur aux informations.

Variables qui ne sont pas thread-safe

Les variables d'instance et les variables de classe sont partagées par plusieurs threads ** Puisque les données sont conservées dans une zone de l'espace mémoire appelée "zone de tas" **, d'autres threads peuvent réécrire les informations ou faire référence aux informations par erreur. Je peux le faire.

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

[Implémentation] N'oubliez pas de le rendre thread-safe | Nikkei xTECH (Cross Tech)

Faites également attention à la balise ** JSP <%!%> Utilisée lors de la déclaration de variables et de méthodes. La balise ** <%!%> N'est pas thread-safe car elle se développe en tant que variable d'instance Servlet ** ** lorsque la JSP est compilée.

Le traitement parallèle est difficile à tester

Les conditions de course sont des bogues de chronométrage très difficiles à détecter dans les tests **. ** **

Brian Goetz (Java Architect, Oracle, à partir de mars 2018), un des principaux experts du traitement parallèle Java, a écrit un article sur le traitement parallèle. Dans "Théorie et pratique Java: tuer sûrement les bogues" Est mentionné comme.

Sans surprise, l'écriture de code est le meilleur moment pour rendre votre code de haute qualité. C'est parce que j'ai la meilleure compréhension de ce qui fonctionne et comment cela fonctionne en ce moment.

** Afin de ne pas intégrer de conditions de compétition, il doit être programmé et révisé par un programmeur qui comprend le parallélisme **.

L'article recommande «Find Bugs» comme un outil partiellement mais efficace pour détecter les bogues de concurrence. "Spotbugs", le successeur de "FindBugs", a plusieurs éléments pour détecter les conditions de course. ("Manuel SpotBugs, Détails des bogues détectables")

Facebook a également publié ** «RacerD» **, un outil d'analyse statique des bogues de concurrence Java, en tant que logiciel open source en octobre 2017. Veuillez jeter un œil tel qu'il est présenté dans l'article suivant

J'ai essayé l'outil d'analyse de bogue de parallélisme Java "RacerD" créé par Facebook --Qiita

Résumé

Livre de référence

Site de référence

Recommended Posts

Comprendre le traitement parallèle Java (Introduction)
[Java] Introduction
Traitement serveur avec Java (Introduction partie 1)
Traitement des threads Java
Traitement des chaînes Java
Introduction à Java
[Java] Traitement multi-thread
[Java] Traitement de flux
traitement itératif java
Java Performance Chapitre 1 Introduction
Traitement des appels du constructeur JAVA
Introduction à la commande java
Java aléatoire, divers traitements
[Java] Traitement multi-thread - Contrôle exclusif
[Java] Compréhension débutante de Servlet-②
[Java] Compréhension débutante de Servlet-①
[Java] Introduction à l'expression lambda
[Java] Stream API - Traitement de l'arrêt du flux
[Java] Stream API - Traitement intermédiaire de flux
[Java] Méthode d'implémentation du traitement du minuteur
Traitement parallèle mesuré avec Java
[Java] Introduction à l'API Stream
Résumé du traitement des erreurs Java
[Introduction aux jeux Janken (comme)] Java
BDD Java 100% pur avec JGiven (Introduction)
[Introduction à Java] À propos des expressions lambda
[Introduction à Java] À propos de l'API Stream
Traitement de la date en Java (LocalDate: Initialization)
Déléguer certains traitements Java à JavaScript
[Java] Traitement en boucle et table de quatre-vingt-dix-neuf
Utilisons Twilio en Java! (Introduction)
Introduction à la programmation fonctionnelle (Java, Javascript)
Exécutez node.js depuis Android Java (traitement)
[Traitement × Java] Comment utiliser les variables
[Java] Qu'est-ce que l'exception de modification simultanée?
Comprendre equals et hashCode en Java
Traitement de flux d'inversion de liste Java étonnamment profond
Flux de traitement de base de Java Stream
A propos du traitement de la copie de fichiers en Java
Remarques sur le traitement des threads Android (java)
Compréhension étape par étape de la gestion des exceptions Java
Suppression de fichiers à l’aide du traitement récursif [Java]
[Traitement × Java] Comment utiliser les tableaux
[Java] Mémo de méthode de mesure du temps de traitement
[Java] Types d'exception et traitement de base
[Introduction à Java] À propos du traitement itératif (while, do-while, for, extension for, break, continue)