recherche
MaisonJavajavaDidacticielConcurrentModificationException en utilisant Iterator en Java

ConcurrentModificationException while using Iterator in Java

Dans les environnements Java multithread, tenter de modifier une collection tout en itérant dessus à l'aide d'un itérateur peut conduire à un ConcurrentModificationException. Cette exception survient parce que l'état interne de la collection devient incohérent.

Voici un exemple illustrant l'exception:

Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:000)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:000)
at com.journaldev.ConcurrentModificationException.ConcurrentModificationExceptionExample.main(ConcurrentModificationExceptionExample.java:00)

Cette exception se produit dans ces conditions:

  • Modification pendant l'itération: l'itérateur n'est pas conçu pour une modification simultanée.
  • Itérateurs de faillite: L'Itérateur utilise un drapeau interne (modCount) pour détecter les modifications et lance l'exception.

Algorithme pour reproduire l'exception

Cet algorithme montre comment déclencher un ConcurrentModificationException en java:

  1. Initialisation: Créer un ArrayList.
  2. Population: Ajouter des éléments au ArrayList.
  3. itération: Obtenez un itérateur en utilisant list.iterator().
  4. Modification: À l'intérieur de la boucle d'itération, modifiez le ArrayList (par exemple, ajouter ou supprimer les éléments).
  5. Exception: Le ConcurrentModificationException est lancé lorsque l'itérateur détecte la modification.

Exemple de code: déclenchant l'exception

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ConcurrentModificationExample {
    public static void main(String[] args) {
        List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(2);
        myList.add(3);

        Iterator<Integer> iterator = myList.iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
            System.out.println("Value: " + value);
            if (value == 2) {
                myList.remove(value); // Modification during iteration!
            }
        }
    }
}

Ce code lancera un ConcurrentModificationException car myList.remove(value) modifie la liste pendant que l'itérateur le traverse.

Techniques de modification sûres

Pour éviter cette exception, utilisez ces approches:

  • Iterator.remove(): Utilisez la méthode iterator.remove() pour supprimer les éléments pendant l'itération. Cette méthode est sûre car elle est conçue pour fonctionner avec l'état interne de l'itérateur.

  • Copiez la liste: Créez une copie de la liste avant d'itérer et modifiez la copie.

  • Utilisez des collections simultanées: Pour les scénarios de modification simultanés, utilisez des collections de filetage comme CopyOnWriteArrayList ou ConcurrentHashMap.

  • Bloc synchronisé: Entrez l'itération et la modification dans un bloc synchronisé pour assurer la sécurité des filetages.

Exemple: Retrait sûr à l'aide de Iterator.remove()

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class SafeRemovalExample {
    public static void main(String[] args) {
        List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(2);
        myList.add(3);

        Iterator<Integer> iterator = myList.iterator();
        while (iterator.hasNext()) {
            Integer value = iterator.next();
            System.out.println("Value: " + value);
            if (value == 2) {
                iterator.remove(); // Safe removal using iterator.remove()
            }
        }
        System.out.println(myList);
    }
}

Ce code révisé supprime en toute sécurité l'élément sans lancer l'exception. N'oubliez pas de choisir la technique appropriée en fonction de vos besoins spécifiques et de vos exigences de concurrence. L'utilisation de collections simultanées est généralement préférée pour les scénarios multithreads.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Quelles sont les stratégies pour atténuer les problèmes spécifiques à la plate-forme dans les applications Java?Quelles sont les stratégies pour atténuer les problèmes spécifiques à la plate-forme dans les applications Java?May 01, 2025 am 12:20 AM

Comment Java atténue des problèmes spécifiques à la plate-forme? Java implémente la plate-forme indépendante de la plate-forme via JVM et des bibliothèques standard. 1) Utilisez Bytecode et JVM pour abstraction des différences du système d'exploitation; 2) La bibliothèque standard fournit des API multiplateformes, telles que les chemins de fichier de traitement des classes de chemins et le codage des caractères de traitement de la classe Charset; 3) Utilisez des fichiers de configuration et des tests multiplateformes dans les projets réels pour l'optimisation et le débogage.

Quelle est la relation entre l'indépendance de la plate-forme de Java et l'architecture des microservices?Quelle est la relation entre l'indépendance de la plate-forme de Java et l'architecture des microservices?May 01, 2025 am 12:16 AM

Java'splatformIndependanceNhancesMicRoservices ArchitectureByoFerringDeploymentFlexibilité, cohérence, évolutivité, etportabilité.1) DeploymentFlexibilityAllowsMicroserviceStorUnonanyPlatformwithajvm.2) CohérenceaCossserviceSiceSIGLYPLATFORMWithajvm.2)

Comment GraalVM est-il lié aux objectifs d'indépendance de la plate-forme de Java?Comment GraalVM est-il lié aux objectifs d'indépendance de la plate-forme de Java?May 01, 2025 am 12:14 AM

Graalvm améliore l'indépendance de la plate-forme de Java de trois manières: 1. Interopérabilité transversale, permettant à Java d'interopérer de manière transparente avec d'autres langues; 2. 3. Optimisation des performances, le compilateur Graal génère un code machine efficace pour améliorer les performances et la cohérence des programmes Java.

Comment tester les applications Java pour la compatibilité des plateformes?Comment tester les applications Java pour la compatibilité des plateformes?May 01, 2025 am 12:09 AM

ToeffectivetestjavaapplicationsforPlatformCompatibilité, suivi de l'essence: 1) SetUpAutomatedStestingacrossMultipleplatformSusingcitoolslikejenkinsorgithubacts.

Quel est le rôle du compilateur Java (Javac) dans la réalisation de l'indépendance de la plate-forme?Quel est le rôle du compilateur Java (Javac) dans la réalisation de l'indépendance de la plate-forme?May 01, 2025 am 12:06 AM

Le compilateur Java réalise l'indépendance de la plate-forme de Java en convertissant le code source en bytecode indépendant de la plate-forme, permettant aux programmes Java d'exécuter sur n'importe quel système d'exploitation avec JVM installé.

Quels sont les avantages de l'utilisation de bytecode sur le code natif pour l'indépendance de la plate-forme?Quels sont les avantages de l'utilisation de bytecode sur le code natif pour l'indépendance de la plate-forme?Apr 30, 2025 am 12:24 AM

ByteCodeachievesPlatformIndependanceBeBeingExEcutedByaVirtualmachine (VM), permettant à la codétorunonanyplatformwiththeappo pourpropriév.forexample, javabytecocecanrunonanydevicewithajvm, permettre de "writeonce, runanywhere" fonctionnalité.

Java est-elle vraiment indépendante de la plate-forme à 100%? Pourquoi ou pourquoi pas?Java est-elle vraiment indépendante de la plate-forme à 100%? Pourquoi ou pourquoi pas?Apr 30, 2025 am 12:18 AM

Java ne peut pas atteindre l'indépendance de la plate-forme à 100%, mais son indépendance de la plate-forme est implémentée via JVM et ByteCode pour s'assurer que le code s'exécute sur différentes plates-formes. Les implémentations spécifiques incluent: 1. Compilation dans ByteCode; 2. Interprétation et exécution de JVM; 3. Cohérence de la bibliothèque standard. Cependant, les différences de mise en œuvre de JVM, les différences de système d'exploitation et de matériel et la compatibilité des bibliothèques tierces peuvent affecter l'indépendance de sa plate-forme.

Comment l'indépendance de la plate-forme de Java prend-elle en charge la maintenabilité du code?Comment l'indépendance de la plate-forme de Java prend-elle en charge la maintenabilité du code?Apr 30, 2025 am 12:15 AM

Java réalise l'indépendance de la plate-forme via "Écrire une fois, exécuter partout" et améliore la maintenabilité du code: 1. Réutilisation du code élevé et réduit le développement en double; 2. Coût de maintenance faible, une seule modification est requise; 3. L'efficacité de collaboration d'équipe élevée est élevée, pratique pour le partage des connaissances.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

MantisBT

MantisBT

Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft