arraylist 线程安全_深度解析CopyOnWriteArrayList,线程安全的ArrayList!

前言

ArrayList是线程不安全的,这点毋庸置疑。因为ArrayList的所有方法既没有加锁,也没有进行额外的线程安全处理。而Vector作为线程安全版的ArrayList,存在感总是比较低。因为无论是add、remove还是get方法都加上了synchronized锁,所以效率低下。
JDK1.5引入的J.U.C包中,又实现了一个线程安全版的ArrayList——CopyOnWriteArrayList。

26b953f075b3962ea6d2aec44139d702.png

成员变量

先来看下CopyOnWriteArrayList类的定义和底层数据结构

public class CopyOnWriteArrayList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    private static final long serialVersionUID = 8673264195747942595L;

    /** The lock protecting all mutators */
    transient final ReentrantLock lock = new ReentrantLock();

    /** The array, accessed only via getArray/setArray. */
    // 存储数据的array数组,注意此处是用volatile修饰的
    private volatile transient Object[] array;
}

根据定义来看,比ArrayList多了一个ReentrantLock成员变量,存储数据的数组用volatile修饰,其余的并没有多少区别。存储数据的结构依然是数组。

构造方法

/**
* Sets the array.
* 语法糖
*/
final void setArray(Object[] a) {
    array = a;
}

/**
* Creates an empty list.
*/
public CopyOnWriteArrayList() {
    setArray(new Object[0]);
}

/**
* Creates a list holding a copy of the given array.
* 创建一个保存给定数组副本的list(把参数给的数组拷贝给成员变量)
*
* @throws NullPointerException if the specified array is null
* 参数数组为null,抛出NullPointerException
*/
public CopyOnWriteArrayList(E[] toCopyIn) {
    setArray(Arrays.copyOf(toCopyIn, toCopyIn.length, Object[].class));
}

看完构造方法依然有些疑惑,成员变量和构造方法看起来比ArrayList还要简单,到底是如何保证线程安全的呢。或许add方法会给我们答案。

核心方法

add(E e)

add(E e)方法用于往list尾部添加元素,CopyOnWriteArrayLi

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值