CopyOnWriteArrayList源码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();
    }
}

网上看到的解释

网上关于CopyOnWriteArrayList的文章大多拷贝自http://ifeve.com/java-copy-on-write/ ,原文对这个疑问的解释如下:

我的理解

这里我觉得这原文的解释不太合理,我的思考是:add的流程“是复制当前数组获得新数组 -> 将元素放到新数组末尾 -》更新数组引用,将其指向新的内存”,如果没有加锁,那么多个线程并发add的时候拿的容器数组不一定是最新的,导致的结果是有些线程add的结果被紧随其后的线程add操作覆盖掉,如下图

原文地址:https://www.cnblogs.com/ming-szu/p/11143255.html

时间: 2024-11-02 10:46:57

CopyOnWriteArrayList源码add加锁的意义的相关文章

CopyOnWriteArrayList 源码阅读与分析

CopyOnWriteArrayList 源码阅读与分析 CopyOnWriteArrayList是并发包下的一个线程安全.可以实现高并发的ArrayList 首先来看看它的构造方法: final void setArray(Object[] a) { array = a; } /** * Creates an empty list. */ public CopyOnWriteArrayList() { setArray(new Object[0]); } 可以看到,它和ArrayList有一定

第三章 CopyOnWriteArrayList源码解析

注:在看这篇文章之前,如果对ArrayList底层不清楚的话,建议先去看看ArrayList源码解析. http://www.cnblogs.com/java-zhao/p/5102342.html 1.对于CopyOnWriteArrayList需要掌握以下几点 创建:CopyOnWriteArrayList() 添加元素:即add(E)方法 获取单个对象:即get(int)方法 删除对象:即remove(E)方法 遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做

jdk并发包 CopyOnWriteArrayList源码分析

CopyOnWriteArrayList是jdk1.5并法包里面用于处理高并发下,读多写少的情况下,降低锁等待的集合类.下面对该类实现做一个简要的分析 1,首先CopyOnWriteArrayList是实现了List接口,对=List接口的相关方法进行了实现. 2,下面的它的add方法,会首先加锁,然后copy原List内部的数组,然后对新数组长度加1后释放锁.由于数组copy速度很快,切在读多写少的情况下锁开销比较少 public boolean add(E e) { final Reentr

死磕 java集合之CopyOnWriteArrayList源码分析

欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离. 继承体系 CopyOnWriteArrayList实现了List, RandomAccess, Cloneable, java.io.Serializable等接口. Copy

关于源码和技术的意义

研究技术的意义到底是什么?比如我把spring一套源码都默写下来,真的有意义吗?可能有意义,书读百遍其义自见:可见读书真谛是"其义",做技术也是如此,关键是获取"其义",所谓其义就是设计的里面和对于环境的思考.并非代码本身:如果懂得这一点,你再去读源码也就有了方向:当然首先是要读懂代码用途,第二部就是读出代码用意,第三步是读出代码机制,这里需要用到"元素-结构"法来对源码进行分析,到了这一步才算是入门,第四步则是看行程思维模式,这个是对于机制的二

CopyOnWriteArrayList源码解析

CopyOnWriteArrayList是java1.5版本提供的一个线程安全的ArrayList变体. 在讲解5.1.1ArrayList的时候,有说明ArrayList的fail-fast特性,它是指在遍历过程中,如果ArrayList内容发生过修改,会抛出ConcurrentModificationException. 在多线程环境下,这种情况变得尤为突出,参见测试代码(代码基于java8): ArrayList<Integer> list = new ArrayList<>

深入集合框架之CopyOnWriteArrayList源码剖析

CopyOnWriteArrayList概述 CopyOnWriteArrayList是ArrayList的一个线程安全的变种. CopyOnWriteArrayList与ArrayList不同处就在于是否会拷贝数组和加锁. CopyOnWriteArrayList顾名思义就是写时复制的ArrayList,其意思就是在修改容器的元素时,并不是直接在原数组上修改,而是先拷贝了一份数组,然后在拷贝的数组上进行修改,修改完后将其引用赋值给原数组的引用.这样体现了读写分离,这样无论在任何时候我们都可以对

CopyOnWriteArrayList 源码---JDK1.8

CopyOnWriteArrayList:通过copy一份以前元素的快照,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器".该集合适合读多写少的场景(读没有加锁,其他更新操作均有加锁). /** The lock protecting all mutators */ final transient ReentrantLock lock = new ReentrantLock(); /** The array, accessed only via getArray/setA

CopyOnWriteArrayList源码阅读

java.util.concurrent包中定义常见集合类对应的并发集合类,用于高效处理并发场景,其中CopyOnWriteArrayList对应就是ArrayList.顾名思义CopyOnWrite,写时拷贝,这里写包括对集合类的修改操作,都会创建一个副本. CopyOnWriteArrayList的实现 类的定义 public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, j