-
fail-fast和fail-safe比较
java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
-
fail-fast产生的原因
通过迭代器每次迭代都会去检查modCount等不等于expectedModCoun,如果不等就会抛出ConcurrentModificationException异常,产生fail-fast事件。(遍历时别的线程对其进行了修改)
即,当多个线程对同一个集合进行操作的时候,某线程访问集合的过程中,该集合的内容被其他线程所改变(即其它线程通过add、remove、clear等方法,改变了modCount的值);这时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
-
解决fail-fast的原理
网上很多博客说解决fail-fast的原理是,在集合进行修改时,会拷贝一份进行修改,原来遍历的过程仍是原数组,不会产生fail-fast,这是放屁。每个类有自己的实现方式,以concurrentHashMap为例,它内部实现了iterator,没有去检查modCount也没有modCount,而是直接拿对象的table,这个table是volatile修饰的,所以别的线程对其修改,当前迭代过程是可见的,这个自己做实验就可以发现,并不是对数据进行了拷贝。ArrayList是拷贝
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)