第四篇:走近CopyOnWriteArrayList

跟風遠走 提交于 2020-01-28 18:46:14

CopyOnWriteArrayList简介

熟悉Java开发的童鞋都知道ArrayList是线程不安全的,在多线程的环境下可能会发生fast-fail机制,抛出ConcurrentModificationException异常,虽然也有并发容器Vector,或者采用Collections的synchronizedCollection方法将ArrayList包装成线程安全类,但是这两种方式都是利用synchronized关键字修饰方法,利用独占锁来保证线程安全,由于独占锁在同一时刻只有一个线程能够获取到对象监视器即读写操作不能并行,所以效率不高。而CopyOnWriteArrayList则采用CopyOnWrite的原理来实现的一个线程安全的容器,读写分离,效率高。

环境

本源码基于JDK1.8

fast-fail机制

fast-fail是一种快速失败机制,在容器中有广泛的运用,我们都知道ArrayList是线程不安全的,当多个线程同时对集合进行结构上的修改时,就可能会产生fast-fail机制。
例如:假设存在线程1,线程2,线程1通过Iterator对集合A进行遍历,线程2对集合A进行结构上的修改(不是仅仅修改一个元素),这时候就会产生fail-fast机制,抛出ConcurrentModificationException异常。
原因:线程对容器ArrayList进行修改时,比如添加元素会对modCount进行加一操作,删除一个元素会对modCount进行减一操作。迭代器(Iterator)对容器进行迭代时,会记下刚迭代时的modCount值并赋值给expectedModCount,调用next()时,会比较expectedModCount和modCount的值,如果不相等则抛出ConcurrentModificationException异常。所以如果在迭代过程中修改modCount值必然导致expectedModCount和modCount值不相等。

COW的

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!