CopyOnWriteArrayList实现解析
Posted 水田如雅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CopyOnWriteArrayList实现解析相关的知识,希望对你有一定的参考价值。
一,内部核心变量定义
/** The lock protecting all mutators */
final transient ReentrantLock lock = new ReentrantLock();
/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;
数据存放在arry内部;
二,读取操作
/**
* Gets the array. Non-private so as to also be accessible
* from CopyOnWriteArraySet class.
*/
final Object[] getArray()
return array;
private E get(Object[] a, int index)
return (E) a[index];
/**
* @inheritDoc
*
* @throws IndexOutOfBoundsException @inheritDoc
*/
public E get(int index)
return get(getArray(), index);
完全没加锁,直接读的arry.
三,add操作
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return @code true (as specified by @link Collection#add)
*/
public boolean add(E e)
final ReentrantLock lock = this.lock;
lock.lock();
try
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
finally
lock.unlock();
添加新值的时候,直接copy一份源数据,new了个新数组,把新元素加入新数组,之后把新数组引用赋值给arry。在写入时候,完全不会影响其他读线程读取原来的arry值,只需对写入进行加锁,控制创建新数组并赋值引用的过程即可。
CopyOnWriteArrayList适用于读多写少的场景。
以上是关于CopyOnWriteArrayList实现解析的主要内容,如果未能解决你的问题,请参考以下文章