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性能解析【教程】

