简介
fail-fast机制是java集合框架中的一种错误机制。当多个线程对同一个集合的结构进行操作时,可能会产生fail-fast,出现java.util.ConcurrentModificationException
。
解决办法
fail-fast机制,是一种错误检测机制,只能被用来检测错误,因为JDK并不保证fail-fast机制一定发生。
- 方法一:在多线程环境下,应该使用“java.util.concurrent”包下的类去取代“java.util”包下的类。
- 方法二:在遍历过程中,所有涉及改变modCount值得地方全部加上synchronized或直接使用Collections.synchronizedList(但是容器结构的更改操作造成的同步锁,可能会阻塞遍历操作,不推荐)。
ArrayList和CopyOnWriteArrayList
这里采用ArrayList
的fail-fast机制和CopyOnWriteArrayList
来解决这个问题。
ArrayList
ArrayList的Iterator会采用fail-fast机制抛出异常ConcurrentModificationException
。
CopyOnWriteArrayList
CopyOnWriteArrayList
的对容器结构的更改方法(add、remove、clear等,以add方法为例),都是对原底层结构array进行复制后,再在复制的数组上进行更改操作,这样就不会影响它的迭代器COWIterator
中的array了。
结构更改操作
|
|
迭代器
CopyOnWriteArrayList
并不会进行fail-fast机制检测。