记录一次不常见ConcurrentModificationException

记录一次不常见ConcurrentModificationException

前言

JDK:8
通常我们了解到这个异常出现的原因:迭代器在遍历过程中如果有另外的线程对集合做结构变化,比如添加元素或者删除元素等操作。昨天在上线的过程中,发现了一个ConcurrentModificationException,异常抛出的位置是ArrayList.sort()。

代码分析

   @Override
    @SuppressWarnings("unchecked")
    public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, size, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }

在排序之前,获取modCount的值,在排序之后,再次比对看这个值有没有发生变化,如果发生变化,抛出ConcurrentModificationException;如果没有发生变化,modCount加1。那么在并发排序的情况下,就会出现t1和t2同时对这个list进行排序,如果t2先完成排序,发现modCount的值没有变化,就会对modCount进行+1,等到t1执行完排序后,发现modCount的值发生变化,那么就会抛出ConcurrentModificationException。

这个modCount的语义什么?
这个字段是定义在AbstractList中的,官方文档上说这个字段的值是用来记录这个list的被修改次数,这里的修改指的是结构变化,改变了list的size,用来做fast-fail的。

错误代码示范

github地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 5,443评论 0 3
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,784评论 0 16
  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 9,845评论 4 50
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 5,622评论 2 17
  • NFD花艺协会的总部位于东京品川地铁站附近,与品川毗邻相接,只两站车程的是大森站,我和好友预订的酒店就在大森地区,...
    孙晔阅读 2,312评论 0 0

友情链接更多精彩内容