java.util.ConcurrentModificationException 并发修改异常处理

来源:互联网 发布:java逻辑 编辑:程序博客网 时间:2024/05/22 01:55


项目代码 

//先根据商户编码获取活动list

Exampleexample=new Example(TPromoActivity.class);

example.createCriteria().andEqualTo("systemMercCode",systemMercCode)

.andNotEqualTo("activityStatus",ActivityStatus.CLOSURE.getCode());

List<TPromoActivity>list=tPromoActivityMapper.selectByExample(example);

if(!Strings.isNullOrEmpty(activityCode)){

//再根据当前活动编码获取叠加活动list2

TPromoActivityVOactivity= selectActivityByCode(activityCode,systemMercCode);

List<TPromoActivityCompVO>list2=tpromoActivityCompService.getList(activity.getId());

//存储叠加活动id

List<Long>activitys=newArrayList<>(list2.size());

activitys.add(activity.getId());

list2.forEach(x->activitys.add(x.getAddedActivityId()));

//去重

for(Iterator<TPromoActivity>iterator=list.iterator();iterator.hasNext();){

TPromoActivityactivityTemp=iterator.next();

if(activitys.contains(activityTemp.getId())){

iterator.remove();

}

}

}

ConcurrentModificationException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。主要原因是iterator.next()时会检查size

大小,如果改变就会抛出异常


附带几个解决方法  带几个解决方

方法一 迭代移除   iterator.remove();

方法二 对应索引移除
//      for (int i = 0; i < list.size(); i++){
//          Integer integer = list.get(i);
//          if (list2.contains(integer)){
//            list.remove(integer);
//            list.remove(i);
//        }
//      }

方法三 : 

list 集合 使用线程安全方式创建 CopyOnWriteArrayList 移除时 按平时操作移除对象

//    while (it.hasNext()) {  
//        String s = it.next();  
//         if (s.equals("string2")) {  
//             strList.remove(s);  
//        }  
//    }  




阅读全文
0 0
原创粉丝点击