并发踩坑:list共享变量的addAll

背景:

某业务报错了,提示:Caused by: org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: java.util.ConcurrentModificationException

分析:

这是执行查询时报的 并发修改异常。大概逻辑是在多线程场景下,有一个共享变量list对象,每个线程都对它执行addAll操作。导致MySQL查询语句执行的时候,这个list还在并发修改,所以抛出的错误。

java 复制代码
public void restList() {
    
    Thread thread1 = new Thread("线程1"){
        @Override
        public void run() {
            innerSide();
        }
    };
    thread1.start();

    Thread thread2 = new Thread("线程2"){
        @Override
        public void run() {
            innerSide();
        }
    };
    thread2.start();                
    
}

public void innerSide(){
    List<String> list = nacos.getList();
    //List<String> list = new ArrayList<>();
    List<String> querys = mapper.selectList(queryWrapper);
    if(CollectionUtils.isNotEmpty(querys)){
        list.addAll(querys);
    }
    System.out.println(Thread.currentThread().getName() +JSONObject.toJSONString(list));

    List<Object> objectList = otherMapper.queryList(list);
}

代码逻辑如上所示,大概就是多个线程并发执行,调用innerSide()方法,但是这个方法里的list,是从nacos上读到的。所以list变量指向的是一个共享的引用地址。所以后续对list进行 addAll操作,每个线程都执行一次。导致list里的值呈指数级别增长。导致后边代码 otherMapper.queryList()方法执行的时候,mybatis报错并发修改。

修改:

list改成new的方式,不要用共享变量。

相关推荐
保持清醒54021 小时前
二叉链表实现
数据结构
paeamecium1 天前
【PAT甲级真题】- Recover the Smallest Number (30)
数据结构·算法·pat考试·pat
玛丽莲茼蒿1 天前
Leetcode hot100 在排序数组中查找元素的第一个和最后一个位置【中等】
数据结构·算法
寒秋花开曾相惜1 天前
(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.3 字级的组合电路和HCL整数表达式)
android·网络·数据结构·笔记·学习
发疯幼稚鬼1 天前
二叉树的广度优先遍历
c语言·数据结构·算法·宽度优先
love在水一方1 天前
【Voxel-SLAM】Data Structures / 数据结构文档(二)
数据结构·人工智能·机器学习
Via_Neo1 天前
乘积最大问题
数据结构·算法
自我意识的多元宇宙1 天前
数据结构----插入排序
数据结构·算法·排序算法
im_AMBER1 天前
Leetcode 162 除了自身以外数组的乘积 | 接雨水
开发语言·javascript·数据结构·算法·leetcode
cpp_25011 天前
P1873 [COCI 2011/2012 #5] EKO / 砍树
数据结构·c++·算法·题解·二分答案·洛谷·csp