并发踩坑: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的方式,不要用共享变量。

相关推荐
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
爱吃苹果的日记本2 小时前
数据结构第三课(时间复杂度)
数据结构·学习
Logic1014 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和
小π军5 小时前
最大重叠区间数量
数据结构·算法
Logic1016 小时前
C语言/数据结构字符串题解:找出DNA序列中未配对的独特序列——排序+遍历(O(nlogn))
c语言·数据结构·字符串·数组·排序·时间复杂度·算法题
wzdark7 小时前
基于链表的内存池设计与内存复用机制4
java·数据结构·链表
BizzZ_9 小时前
算法(1)——双指针
数据结构
Doubbbbbbble云9 小时前
内存碎片化对数据结构操作性能的影响研究4
数据结构
xiangyun6111 小时前
【408数据结构 03】线性表与顺序表:C++手写SeqList
开发语言·数据结构·c++