热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中的ConcurrentModificationException,示例

Java中的ConcurrentModificationException,示例

Java 中的 ConcurrentModificationException,示例

原文:https://www . geeksforgeeks . org/concurrentmodificationexception-in-Java-with-examples/

并发修改多线程环境中的异常

多线程环境 中,如果在资源检测期间,任何方法发现该对象存在不允许的并发修改,则可能会引发该并发修改异常。


  1. If this exception is detected, the result of iteration is undefined.

  2. Generally speaking, some iterator implementations choose to throw this exception, which is called Fail fast iterator .

例如:如果我们试图使用一个线程修改代码中的任何集合,但是另一个线程已经在使用该集合,那么这是不允许的。

并发修改单线程环境中的异常

因为,不能保证每当引发这个异常时,一个对象已经被某个不同的线程并发修改,这个异常也会在单线程环境中抛出。

如果我们在违反约定的对象上调用一系列方法,那么该对象将抛出 ConcurrentModificationException。

例如:如果在迭代集合时,我们直接尝试修改该集合,那么给定的快速失败迭代器将抛出这个 ConcurrentModificationException。

示例: 在下面的代码中,实现了一个 ArrayList。然后向其添加很少的值,并在遍历时对其进行很少的修改,

// Java program to show
// ConcurrentModificationException
import java.util.Iterator;
import java.util.ArrayList;
public class modificationError {
    public static void main(String args[])
    {
        // Creating an object of ArrayList Object
        ArrayList<String> arr
            = new ArrayList<String>();
        arr.add("One");
        arr.add("Two");
        arr.add("Three");
        arr.add("Four");
        try {
            // Printing the elements
            System.out.println(
                "ArrayList: ");
            Iterator<String> iter
                = arr.iterator();
            while (iter.hasNext()) {
                System.out.print(iter.next()
                                 + ", ");
                // ConcurrentModificationException
                // is raised here as an element
                // is added during the iteration
                System.out.println(
                    "\n\nTrying to add"
                    + " an element in "
                    + "between iteration\n");
                arr.add("Five");
            }
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

输出:

ArrayList:
One,
Trying to add an element in between iteration
java.util.ConcurrentModificationException

如何避免 ConcurrentModificationException?T3】

为了避免这个异常,


  • Simply put, we can modify it after the iteration is completed, or

  • Concept or method of realizing synchronization block

示例:让我们看看如何通过简单地更改修改的地方来解决这个异常。

// Java program to show
// ConcurrentModificationException
import java.util.Iterator;
import java.util.ArrayList;
public class modificationError {
    public static void main(String args[])
    {
        // Creating an object of ArrayList Object
        ArrayList<String> arr
            = new ArrayList<String>();
        arr.add("One");
        arr.add("Two");
        arr.add("Three");
        arr.add("Four");
        try {
            // Printing the elements
            System.out.println(
                "ArrayList: ");
            Iterator<String> iter
                = arr.iterator();
            while (iter.hasNext()) {
                System.out.print(iter.next()
                                 + ", ");
            }
            // No exception is raised as
            // a modification is done
            // after the iteration
            System.out.println(
                "\n\nTrying to add"
                + " an element in "
                + "between iteration: "
                + arr.add("Five"));
            // Printing the elements
            System.out.println(
                "\nUpdated ArrayList: ");
            iter = arr.iterator();
            while (iter.hasNext()) {
                System.out.print(iter.next()
                                 + ", ");
            }
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

输出:

ArrayList:
One, Two, Three, Four,
Trying to add an element in between iteration: true
Updated ArrayList:
One, Two, Three, Four, Five,

从输出中可以清楚地看到,只要对代码进行最小的更改,就可以消除 ConcurrentModificationException。


推荐阅读
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
author-avatar
小明爱微笑_401
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有