java高并发之CopyOnWriteArrayList的那些事

注意:本文内容基于JDK11,不同版本会有差异

1|0数据结构

CopyOnWriteArrayList本质上仍是一个数组,所以的实现都是基于数组来进行的

2|0源码解析

本文以add方法来解析CopyOnWriteArrayList,来看看它如何进行数组存储和实现高并发的。
CopyOnWriteArrayList的add实现方法要比ArrayList更加的直观易懂。

/** * 只能被getArray/setArray方法访问 * array为CopyOnWriteArrayList存储数据的具体数组 */ private transient volatile Object[] array; /** * CopyOnWriteArrayList会在初始化时,在默认的构造函数里创建一个长度为0的数组 */ public CopyOnWriteArrayList() { setArray(new Object[0]); } /** * add实现高并发的原理即使用了synchronized同步关键字 * @param e * @return */ public boolean add(E e){ synchronized (lock){ Object[] es = getArray(); //第一次默认的初始化长度为0 int len = es.length; es = Arrays.copyOf(es, len + 1); es[len] = e; setArray(es); return true; } } public E remove(int index){ synchronized (lock){ Object[] es = getArray(); int len = es.length; E oldValue = elementAt(es, index); //用于判断 需要移动的数量 int numMoved = len - index - 1; Object[] newElements; if(numMoved == 0){ newElements = Arrays.copyOf(es, len-1); }else { newElements = new Object[len - 1]; //复制index之前的数据 System.arraycopy(es, 0, newElements, 0, index); //复制index之后的数据 System.arraycopy(es, index + 1, newElements, index, numMoved); } setArray(newElements); return oldValue; } }

__EOF__

本文作者飞翔的鲸
本文链接https://www.cnblogs.com/whaletail/p/16031377.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   whale_tail  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示