Fail-fast快速报错:
是指当有其他线程对一个容器(如ArrayList,HashMap)进行了结构性修改,另外一个线程在使用iterator进行迭代,那么这个迭代线程会抛出并发修改的异常ConcurrentModificationException。
所谓结构性修改,是对原有容器的size造成影响的操作,如remove、add、clear操作等。
fail-fast 机制,是一种错误检测机制。 它只能被用来检测错误,因为JDK并不保证fail-fast机制一定会发生。
产生 fail-fast 事件,是通过抛出 ConcurrentModificationException 异常来触发的。
CopyOnWriteArrayList可以避免fail-fast。CopyOnWriteArrayList是线程安全的。
出现问题
ArrayList在迭代过程中,如果有其他线程对list进行了结构性修改
private static List<String> list = new ArrayList<String>();
替换为
解决思路
方案一:在遍历过程中所有涉及到改变modCount值得地方全部加上synchronized或者直接使用Collections.synchronizedList,这样就可以解决。但是不推荐,因为增删造成的同步锁可能会阻塞遍历操作。
方案二:使用CopyOnWriteArrayList来替换ArrayList。
CopyOnWriteArrayList所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。
该类产生的开销比较大,但是在两种情况下,它非常适合使用。1:在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时。2:当遍历操作的数量大大超过可变操作的数量时。
CopyOnWriterArrayList根本就不会产生ConcurrentModificationException异常,也就是它使用迭代器完全不会产生fail-fast机制。
private static List<String> list = new CopyOnWriteArrayList<String>();
java fail-fast机制详解
https://blog.csdn.net/xiaotaode2012/article/details/39777797
关于快速报错fail-fast想说的之fail-fast的实现原理(一)
https://blog.csdn.net/fan2012huan/article/details/51076970
关于快速报错fail-fast想说的之fail-fast的避免方法(二)
https://blog.csdn.net/fan2012huan/article/details/51084297
Boy-20180613
网友评论