JAVA并发包类 - CopyOnWriteArrayList

2017-10-29  本文已影响0人  KingToOne

说明:以下内容皆属于个人对源码的理解,可能存在歧义、误解、错误及理解不全面的情况,还望指正

一、CopyOnWriteArrayList介绍

CopyOnWriteArrayListArrayList的线程安全变体。底层通过创建数组的新副本来实现并发情况下对数组的更新操作(包括add、set等方法)。这种方式通常是花费代价比较大的,但是当遍历操作远大于更新操作的情况时,这种方式却是更有效的。当然,我们需要避免并发线程之间的干扰。CopyOnWriteArrayList允许添加所有的元素,包括Null

内存一致性效果:与其他并发集合一样,将对象放入CopyOnWriteArrayList之前的线程中的动作发生在另一个线程的CopyOnWriteArrayList中访问或删除该元素之后的操作之前。

二、CopyOnWriteArrayList实现

/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;

底层数组变量array被声明为volatile 类型的,这样在对数组进行遍历的时候获取的都是最新的值。那么并发访问数据遍历的问题就得以解决。
在创建
CopyOnWriteArrayList
对象实例时,同时会创建一个ReentranctLock的实例。

三、CopyOnWriteArrayList总结

CopyOnWriteArrayList的实现,可以看出包含了2个思想:读写分离和最终一致性(因为并发访问情况下,某个线程作了元素的更新操作后,array变量尚未指向新数组前,其它线程访问的可能还是原来的数组里的元素)。对于多线程情况下,遍历访问操作远大于更新操作的时候,CopyOnWriteArrayList无疑是最好的选择,省略了我们自己去加同步的操作。但是数组的拷贝是一项费时费资源的操作,对于非多线程或数据变化较多的情况下,还是避免使用。

上一篇下一篇

猜你喜欢

热点阅读