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实现解析的主要内容,如果未能解决你的问题,请参考以下文章

CopyOnWriteArrayList并发容器源码解析

CopyOnWriteArrayList并发容器源码解析

CopyOnWriteArrayList实现原理以及源码解析

高并发容器CopyOnWriteArrayList原理解析

CopyOnWriteArrayList源码解析

CopyOnWriteArrayList源码解析