前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ConcurrentModificationException异常原因和解决方法

ConcurrentModificationException异常原因和解决方法

作者头像
oktokeep
发布2024-10-09 11:00:23
940
发布2024-10-09 11:00:23
举报
文章被收录于专栏:第三方工具

ConcurrentModificationException异常原因和解决方法

代码语言:javascript
复制
public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>(){
        {
            add(1);
            add(2);
            add(3);
        }
    };
    Iterator<Integer> iterator = list.iterator();
    while (iterator.hasNext()) {
        iterator.next();
        list.add(4);
    }
}

ConcurrentModificationException 中文意思就是并发修改异常,存在于并发使用 Iterator 时出现的时候,那这个异常是为什么会出现的呢?这个涉及到 fast-fail 机制(快速失败),可以提前预料遍历失败情况,防止数组越界异常。

2种解决办法: 在使用iterator迭代的时候使用synchronized或者Lock进行同步; 使用并发容器CopyOnWriteArrayList代替ArrayList和Vector。

代码语言:javascript
复制
package com.example.core.mydemo.java;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class TestThread {
    public static void main(String[] args) {
//        List<Integer> list = new ArrayList<Integer>(){
//            {
//                add(1);
//                add(2);
//                add(3);
//            }
//        };
//        Iterator<Integer> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            iterator.next();
//            list.add(4);
//        }

        //解决1
//        CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<Integer>(){
//            {
//                add(1);
//                add(2);
//                add(3);
//            }
//        };
//        Iterator<Integer> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            iterator.next();
//            list.add(4);
//        }

        //解决2
//        List<Integer> list = new ArrayList<Integer>(){
//            {
//                add(1);
//                add(2);
//                add(3);
//            }
//        };
//
//        List<Integer> result = new ArrayList<Integer>();
//        Iterator<Integer> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            int id = iterator.next();
//            //或者新增集合来接收。而不要在一个集合中处理
//            result.add(id);
//        }
//        //逻辑调整,放在循环体的外面,或者新增集合来接收。
//        list.add(4);

        //解决3,不使用 iterator
//        List<Integer> list = new ArrayList<Integer>(){
//            {
//                add(1);
//                add(2);
//                add(3);
//            }
//        };
//
//        for (int i = 0; i < 3; i++) {
//            System.out.println(list.get(i)+"");
//            list.add(4);
//
//        }

        //情况4 在使用iterator迭代的时候使用synchronized或者Lock进行同步??
        List<Integer> list = new ArrayList<Integer>(){
            {
                add(1);
                add(2);
                add(3);
            }
        };

        List<Integer> list2 =  Collections.synchronizedList(list) ;

        Iterator<Integer> iterator = list2.iterator();
        //加锁,会报错
        synchronized (iterator) {
            while (iterator.hasNext()) {
                iterator.next();
//                list2.add(4);
            }
        }
    }
    
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档