Java集合类源码中的modCount属性有什么用?fail-fast和fai-safe

news/2024/10/17 22:24:43/

一.modCount字段解释

在看HashMap,HashTable,PriorityQueue等集合类源码时,经常会发现在add,remove方法的代码块中,都有一个modCount++字段,它表示什么呢

transient int modCount;

注释如下

/*** The number of times this HashMap has been structurally modified* Structural modifications are those that change the number of mappings in* the HashMap or otherwise modify its internal structure (e.g.,* rehash).  This field is used to make iterators on Collection-views of* the HashMap fail-fast.  (See ConcurrentModificationException).*/

翻译:

  • 该字段表示list结构上被修改的次数。结构上的修改指的是那些改变了list的长度大小或者使得遍历过程中产生不正确的结果的其它方式。
  • 该字段被Iterator以及ListIterator的实现类所使用,如果该值被意外更改,Iterator或者ListIterator 将抛出ConcurrentModificationException异常
  • 这是jdk在面对迭代遍历的时候为了避免不确定性而采取的 快速失败(fail-fast) 原则

二.fail-fast 快速失败原则

  • 描述:在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception

  • 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历

所以modCount字段实际上就是JDK为了在遍历时集合内容不变的一种安全策略,如果通过其他的方法比如remove,put修改了集合结构,那么在遍历时就会抛出异常。

java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)


三.fail-safe 安全失败原则

  • 描述 :采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历

  • 原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception

  • 缺点 :基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,原因:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的

java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改


http://www.ppmy.cn/news/479491.html

相关文章

Linux系统fd最大数,linux 中 fd 最大多少,手机渠道销售里的FD是什么意思?

在Linux下,系统全部能够打开的fd总数为: /proc/sys/fs/file-max,取决于内存 The file-max file /proc/sys/fs/file-max sets the maximum number of file-handles that the Linux kernel will allocate. We generally tune this file to impr…

希腊字母在数学或物理中代表的意思各是什么

序号 大写 小写 英文注音 国际音标注音 中文读音 意义 1 Α α alpha a:lf 阿尔法 角度;系数 2 Β β beta bet 贝塔 磁通系数;角度;系数 3 Γ γ gamma ga:m 伽马 电导系数(小写) 4 Δ δ delta delt 德尔塔 变动…

工厂常用名词

P/R P/R(Pilot Run)试产,试运行 FAI FAI(first article inspection)检测是指首件检验,模具开发完成后,制作的第一件样品,就是首件。对首件进行三维测量(误差测量)则指首件检验。 零…

椭圆形中间一个大写的v_一个横着的椭圆中间画了一个竖线这是什么符号 10分...

Φ字母来源 1.1Φ希腊字母 读音,fai(大写Φ,小写φ),是第二十一个希腊字母。 希腊小写字母,左上角的弯是开口的;而用作符号时,通常会写作 ,变了一个缩小了的大写Φ的形状(Unicode: U03D5)。 1.2…

flamingo的中文意思是什么_flamingo.是什么意思

1. Lake Nakurus claim to fame is anchored on its flamingos and the over 400 species of birds found here. 纳库鲁湖以其众多的火烈鸟以及超过400种的各种鸟类而著名。 2. I say, John, I see your flamingowith the broken leg! 我说,约翰,我看见你…

计算机专用英语词汇

1.单词说明: command n. 命令,指令 [kə’mɑ:nd] 单词拼写 名词 单词含义 音标(发音) 提示:着重记忆单词对应的意思,有能力最好词性也记忆。 2.词性说明: n v vi vt conj prep pron adj adv 名词 动词 非及…

计算机常见单词

1.单词说明: command n. 命令,指令 [kə’mɑ:nd]   单词拼写 名词 单词含义 音标(发音)   提示:着重记忆单词对应的意思,有能力最好词性也记忆。 2.词性说明: n v vi vt conj prep pron adj adv …

eNSP安装包以及插件镜像包(eNSP设备包)全集

eNSP安装包、以及eNSP中所需要的镜像包(设备包)(CE、CX、NE40E、NE5000E、NE9000、USG)例如:导入一个USG设备包,eNSP中的USG5500和USG6000V都是可以启动的 百度云盘:华为eNSP安装包以及镜像包 h…