Par exemple, avez-vous implémenté les points suivants en tenant compte du traitement parallèle?
++
) et décrémenter (-
)<%!%>
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.
Tout d'abord, comprenons comment Java fonctionne en mémoire.
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. ** **
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)
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.
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" **.
En Java, certaines variables sont thread-safe et d'autres non. Je voudrais expliquer comment ces variables fonctionnent en mémoire.
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 **.
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.
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.
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
<%!%>
Ne sont ** pas thread-safe. ** **Recommended Posts