0
点赞
收藏
分享

微信扫一扫

源码解读fail-fast与fail-safe机制

waaagh 2022-04-22 阅读 71
java

文章目录

准备

这里可以先阅读一下ArrayList扩容机制

介绍

基本介绍我放在这个文章里面了fail-fast与fail-safe

源码解读

fail-fast

向ArrayList里面添加元素是,会经过这个方法,这篇文章我们重点关注这个地方,modCount++,他有什么作用呢,在前面我写的ArrayList扩容机制里面并没有详细介绍它的作用,因为在单线程操作时他并不会发挥作用。他在这个fail-fast机制里起了决定性的作用。进入源码解读,利用idea debug工具模拟一个线程迭代ArrayList,另一个线程向其中添加数据(fail-fast与fail-safe这篇文章里面有具体的操作方法)

在这里插入图片描述
发现for-each循环是新建了一个迭代器,这个迭代器里面,会先把list的modCount属性赋值给了这个迭代器的expectedModCount,在每次循环时调用hasNext()与next()方法进行遍历,而在执行next()方法时,
会先执行一个checkForComodification()的方法,我们已经知道modCount会在添加元素的时候发生改变,当迭代器遍历时,发现这个modCount与开始迭代前记录的不一致时,就抛出异常。Vector也是一样的效果。

在这里插入图片描述
在这里插入图片描述

fail-safe

这里就使用这种机制的典型代表CopyOnWriteArrayList的源码解读
同样的再进行迭代是创建一个迭代器,这里叫COWIterator,这个迭代器会将CopyOnWriteArrayList的array做一份快照存在自己的snapshot属性中,在他的遍历方法中也看的出来他只是遍历对快照进行遍历,再去看CopyOnWriteArrayList的add方法,
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
这里也就是说添加是一个数组,遍历是另一个数组,两者互不影响,从而实现读写分离。

举报

相关推荐

0 条评论