并发踩坑:list共享变量的addAll
2023-12-23 18:03:30
背景:
某业务报错了,提示:Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.util.ConcurrentModificationException
分析:
????????这是执行查询时报的 并发修改异常。大概逻辑是在多线程场景下,有一个共享变量list对象,每个线程都对它执行addAll操作。导致MySQL查询语句执行的时候,这个list还在并发修改,所以抛出的错误。
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的方式,不要用共享变量。
文章来源:https://blog.csdn.net/u010096526/article/details/135170279
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!