java.util.ConcurrentModificationException对于这个异常我们一般会认为是在遍历list的时候对这个list做了add,remove等修改操作造成的,最近在线上日志偶尔发现了这个异常,完整异常如下:
1 | java.util.ConcurrentModificationException: null |
代码如下:(原有代码比较复杂,写个类似demo代替)
1 | public class CmeTest { |
代码的主要逻辑就是并发地对一个list进行排序。查看Collections.sort()的源码如下:
1 | 1 @Override |
重点看第6,10行,当第一个线程排序完成,执行完第9行时第二个线程正好执行到第6行,这时候就会抛出ConcurrentModificationException,所以对于全局的list,做并发排序的时候需要额外注意一下。解决方法有两个:
1.加锁
2.创建新的list,再将全局list的数据addAll到新list中,对新list排序