arrayList里的快速失败】的更多相关文章

快速失败是指某个线程在迭代集合类的时候,不允许其他线程修改该集合类的内容,这样迭代器迭代出来的结果就会不准确. 比如用iterator迭代collection的时候,iterator就是另外起的一个线程,它去迭代collection,如果此时用collection.remove(obj)这个方法修改了collection里面的内容的时候,就会出现ConcurrentModificationException异常,这时候该迭代器就快速失败. 代码如下: package com.vino.assem…
以下内容基于jdk1.7.0_79源码: 什么是集合迭代器快速失败行为 以ArrayList为例,在多线程并发情况下,如果有一个线程在修改ArrayList集合的结构(插入.移除...),而另一个线程正在用迭代器遍历读取集合中的元素,此时将抛出ConcurrentModificationException异常立即停止迭代遍历操作,而不需要等到遍历结束后再检查有没有出现问题: ArrayList.Itr迭代器快速失败源码及例子 查看ArrayList的Itr迭代器源码,可以看到Itr为ArrayL…
参考资料:http://blog.csdn.net/chenssy/article/details/38151189 快速失败 fail-fast 安全失败 fail-safe java.util包下面的所有的集合类都是快速失败的 java.util.concurrent包下面的所有的类都是安全失败的 快速失败的迭代器会抛出ConcurrentModificationException异常 安全失败的迭代器不会抛出ConcurrentModificationException异常. 快速失败 是…
之前在程序中遇到快速失败的问题,在网上找解释时发现网上的问题总结都比较片面,故打算自己总结一个,也可以供以后参考. --宇的季节 首先什么是快速失败? 快速失败是为了提示程序员在多线程的情况下不要用线程不安全的集合(bug)的一种机制. 当然在单线程的情况下有时也会出现ConcurrentModificationException异常,下面我们就根据ArrayList来探索快速失败的内部实现方法. 示例一: public static void main(String[] args) { Lis…
一.问题描述 话不多说,先上代码: public static void main(String[] args) throws InterruptedException { List<String> list = new ArrayList<String>(); list.add("第零个"); list.add("第一个"); list.add("第二个"); list.add("第三个"); lis…
先来看一个例子: @Test void test2() { ArrayList<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e"); // list.add("f"); Iterator&l…
目录 一.引起异常的代码 二.foreach原理 三.从ArrayList源码找原因 四.单线程解决方案 五.在多线程环境下的解决方法 一.引起异常的代码 以下三种的遍历集合对象时候,执行集合的remove和add的操作时候都会引起java.util.ConcurrentModificationException异常. 注:set方法不会导致该异常,看了源码set没有改变modcount.快速失败迭代器在遍历时不允许结构性修改,javadoc中对此的解释是“结构上的修改是指任何添加或删除一个或多…
fail-fast 机制是Java集合(Collection)中的一种错误机制.当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast(快速失败)事件.例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了:那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件. 迭代器的快速失败行为无法得到保证,它不能保证一定会出现该错误,但是快速失败操作会尽最大努力抛出Concurr…
1.fail-fast和fail-safe比较 Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响.java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的.快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常. 快速失败示例 import java.util.*; import java.util.concurrent…
声明 特点:基于JDK源码进行分析. 研究费时费力,如需转载或摘要,请显著处注明出处,以尊重劳动研究成果:博客园 - https://www.cnblogs.com/johnnyzen/p/10547179.html,侵权必究,蟹蟹理解. /** * @IDE: Created by IntelliJ IDEA. * @Author: 千千寰宇 * @Email: 1125418540@qq.com * @Date: 2019/3/17 12:46:34 * @Description: Java…