热门标签 | 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 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
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社区 版权所有