[Java] Qu'est-ce que l'exception de modification simultanée?

Journal d'étude de programmation

15 novembre 2020 Lorsque j'ai écrit le code en Java et vérifié s'il utilisait le test, j'ai reçu une exception appelée java.util.ConcurrentModificationException, donc je vais résumer ce qu'est l'exception ConcurrentModificationException et ce qu'il faut faire.

Qu'est-ce que ConcurrentModificationException?

Javadoc of ConcurrentModificationException déclare comme suit.

Cette exception est levée lorsqu'une méthode qui détecte un changement parallèle dans un objet ne permet pas un tel changement.

Fondamentalement, il est utilisé pour échouer d'abord pour échouer tôt et lancer une exception quand quelque chose qui répète des changements </ b>. Autrement dit, une exception s'est produite avant la fin du processus itératif.

L'instruction for-each utilise Iterator, qui n'est pas très redondant, mais vous pouvez accéder à des méthodes supplémentaires telles que remove () si vous refactorisez votre test pour utiliser Iterator. La méthode remove ne provoque pas d'exception ConcurrentModificationException, vous pouvez donc l'appeler pendant un processus itératif.

Dans le cas de mon code, il y avait un problème avec la façon de gérer ArrayList. ArrayList et Iterator contiennent en interne le "nombre de modifications". L'itérateur généré par la méthode iterator () de ArrayList vérifie s'il y a un écart dans le nombre de changements lors du démarrage de la méthode next () etc. utilisé lors du virage avec for, et en raison d'un écart, une exception de ConcurrentModificationException Se produisait. Il y avait la description suivante dans Javadoc ArrayList.

L'itérateur renvoyé par les méthodes iterator et listIterator de cette classe est failfast. Une fois l'itérateur créé, l'itérateur lève une ConcurrentModificationException si la liste est structurellement modifiée par une méthode autre que la méthode remove ou add de l'itérateur lui-même. Ainsi, lorsque des modifications sont apportées en parallèle, l'itérateur lève une exception immédiatement et gracieusement pour éviter le risque de comportement imprévisible à des moments imprévisibles dans le futur. Généralement, avec des modifications parallèles asynchrones, il n'est pas possible de garantir le comportement de restauration de l'itérateur, car il n'est pas possible de faire une garantie fiable. L'itérateur Failfast lève une ConcurrentModificationException basée sur le principe du meilleur effort. Par conséquent, c'est une erreur d'écrire un programme qui dépend de cette exception pour la précision. "Le comportement Failfast de l'itérateur ne doit être utilisé que pour détecter les bogues."

Références

Classe ConcurrentModificationException Évitez ConcurrentModificationException en Java

Recommended Posts

[Java] Qu'est-ce que l'exception de modification simultanée?
Qu'est-ce que 'java
Qu'est-ce que Java <>?
Qu'est-ce que l'encapsulation Java?
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
[Java] Qu'est-ce que flatMap?
[Java] Qu'est-ce que ArrayList?
Qu'est-ce que l'assertion Java? Résumé.
Qu'est-ce qu'une collection Java?
[Java] Qu'est-ce que jaee j2ee?
[Java] Qu'est-ce que l'héritage de classe?
[Notions de base Java] Qu'est-ce que la classe?
Qu'est-ce que l'analyse Java Escape?
Qu'est-ce que JVM (Java Virtual Machine)?
Qu'est-ce que Thread Safe (avec Java)
Qu'est-ce qu'une expression lambda (Java)
Qu'est-ce qu'une classe en langage Java (3 /?)
Quelle est la meilleure lecture de fichier (Java)
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce que Java et l'environnement de développement (MAC)
Qu'est-ce qu'une classe en langage Java (2 /?)
Quelle est la méthode principale en Java?
Java Exception StackTrace est déterminé lorsque nouveau
Gestion des exceptions Java?
Qu'est-ce qui est nul? ]
Qu'est-ce que Keycloak
Qu'est-ce que Jackson?
Qu'est-ce que soi
Qu'est-ce que Jenkins
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que la façade? ??
Qu'est-ce que Gradle?
Qu'est-ce que centOS
[Java] Gestion des exceptions
Qu'est-ce que RubyGem?
☾ Java / Gestion des exceptions
Qu'est-ce que before_action?
Qu'est-ce que Docker
À propos de la gestion des exceptions Java
Gestion des exceptions Java
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Qu'est-ce que le modèle Java Servlet / JSP MVC?
Quel est le modificateur volatile pour les variables Java?
Qu'est-ce que `docker-compose up`?
Qu'est-ce qu'un constructeur
[java] Lancer une exception
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce qu'une permission refusée?
Qu'est-ce que le contrôle d'instance?
Qu'est-ce que Spring Tools 4
Qu'est-ce qu'un opérateur?