java 中modCount 详解及源码分析

发布时间 - 2026-01-10 22:51:12    点击率:

modCount到底是干什么的呢

在ArrayList,LinkedList,HashMap等等的内部实现增,删,改中我们总能看到modCount的身影,modCount字面意思就是修改次数,但为什么要记录modCount的修改次数呢?

大家发现一个公共特点没有,所有使用modCount属性的全是线程不安全的,这是为什么呢?说明这个玩意肯定和线程安全有关系喽,那有什么关系呢

阅读源码,发现这玩意只有在本数据结构对应迭代器中才使用,以HashMap为例:

private abstract class HashIterator<E> implements Iterator<E> {
    Entry<K,V> next;    // next entry to return
    int expectedModCount;  // For fast-fail
    int index;       // current slot
    Entry<K,V> current;   // current entry

    HashIterator() {
      expectedModCount = modCount;
      if (size > 0) { // advance to first entry
        Entry[] t = table;
        while (index < t.length && (next = t[index++]) == null)
          ;
      }
    }

    public final boolean hasNext() {
      return next != null;
    }

    final Entry<K,V> nextEntry() {
      if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
      Entry<K,V> e = next;
      if (e == null)
        throw new NoSuchElementException();

      if ((next = e.next) == null) {
        Entry[] t = table;
        while (index < t.length && (next = t[index++]) == null)
          ;
      }
      current = e;
      return e;
    }

    public void remove() {
      if (current == null)
        throw new IllegalStateException();
      if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
      Object k = current.key;
      current = null;
      HashMap.this.removeEntryForKey(k);
      expectedModCount = modCount;
    }
  }

由以上代码可以看出,在一个迭代器初始的时候会赋予它调用这个迭代器的对象的mCount,如何在迭代器遍历的过程中,一旦发现这个对象的mcount和迭代器中存储的mcount不一样那就抛异常

好的,下面是这个的完整解释

Fail-Fast 机制

我们知道 java.util.HashMap 不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略。这一策略在源码中的实现是通过 modCount 域,modCount 顾名思义就是修改次数,对HashMap 内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的 expectedModCount。在迭代过程中,判断 modCount 跟 expectedModCount 是否相等,如果不相等就表示已经有其他线程修改了 Map:注意到 modCount 声明为 volatile,保证线程之间修改的可见性。

所以在这里和大家建议,当大家遍历那些非线程安全的数据结构时,尽量使用迭代器

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # modCount  # modCount详解  # modCount分析  # Java中包装类介绍与其注意事项  # java实现字符串和日期类型相互转换的方法  # java计算给定字符串中出现次数最多的字母和该字母出现次数的方法  # java HashMap内部实现原理详解  # Java中基于maven实现zxing二维码功能  # Java将文件分割为多个子文件再将子文件合并成原始文件的示例  # java实现文件保存到本地的方法  # 详解Java中“==”与equals()的区别  # Java 散列存储详解及简单示例  # Java之Spring AOP 实现用户权限验证  # java Socket UDP实例详解  # 迭代  # 过程中  # 遍历  # 数据结构  # 这是  # 器中  # 这一  # 在这里  # 那就  # 中有  # 希望能  # 注意到  # 都将  # 为例  # 可以看出  # 什么呢  # 顾名思义  # 谢谢大家  # 会将  # 有什么关系 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel如何优化应用性能?(缓存和优化命令)  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  轻松掌握MySQL函数中的last_insert_id()  *服务器网站为何频现安全漏洞?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  微信小程序 input输入框控件详解及实例(多种示例)  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel如何使用Telescope进行调试?(安装和使用教程)  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel如何创建自定义Facades?(详细步骤)  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何在IIS中新建站点并配置端口与物理路径?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  JS碰撞运动实现方法详解  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何在七牛云存储上搭建网站并设置自定义域名?  如何在建站之星绑定自定义域名?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  如何在腾讯云服务器快速搭建个人网站?  如何在局域网内绑定自建网站域名?  如何快速搭建安全的FTP站点?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  如何在景安云服务器上绑定域名并配置虚拟主机?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel中的withCount方法怎么高效统计关联模型数量  b2c电商网站制作流程,b2c水平综合的电商平台?  如何快速完成中国万网建站详细流程?  Laravel如何实现API资源集合?(Resource Collection教程)  原生JS获取元素集合的子元素宽度实例  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何用PHP快速搭建高效网站?分步指南  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  网站制作企业,网站的banner和导航栏是指什么?  香港服务器如何优化才能显著提升网站加载速度?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel集合Collection怎么用_Laravel集合常用函数详解  EditPlus中的正则表达式 实战(2)  Python文件流缓冲机制_IO性能解析【教程】