CopyOnWriteArrayList 源码分析 基于jdk1.8
CopyOnWriteArrayList 源码分析:
1:成员属性:
final transient ReentrantLock lock = new ReentrantLock(); //内部是通过ReentrantLock来保证线程安全的,通过一个非公平锁
private transient volatile Object[] array; 维护一个Object数组
2:构造方法 初始化一个长度为0 的Object数组 new Object[0]
public CopyOnWriteArrayList() {
setArray(new Object[0]);
}
setArray方法如下:
final void setArray(Object[] a) {
array = a; //将初始化后的Object 数组赋值给array成员变量
}
到此初始化方法结束:主要做了以下两个初始化过程:
1:初始化创建一个长度为0 的Object数组,并且赋值给 array成员变量
2:初始化一个ReentrantLock 非公平可重入锁,之后用于保证线程安全
3:add 方法分析:以第一次添加元素元素额为例 e=”aa”
public boolean add(E e) { // e=aa
final ReentrantLock lock = this.lock; //使用初始化构建的ReentrantLock
lock.lock(); //加锁
try {
Object[] elements = getArray(); //获取数组成员变量array,这里为Object[0]
int len = elements.length; // len=0
Object[] newElements = Arrays.copyOf(elements, len + 1); //copy elements到新数组中 长度为len+1
newElements[len] = e; //将需要add的元素放置到newElements 的len索引位置
setArray(newElements); //将新数组赋值给成员变量array
return true;
} finally {
lock.unlock(); //释放锁
}
}
Get 方法分析:
public E get(int index) {
return get(getArray(), index); //获取成员变量array 数组的index 位置处的元素
}
总结:CopyOnWriteArrayList 每次添加一个元素的时候都会进行一下拷贝,将原始数组拷贝到长度是原始数组+1的新数组中,并且将新数组赋值给成员变量array.对性能有一定的影响;而对于读则直接读取索引的位置,效率很高。
CopyOnWriteArrayList 源码分析 基于jdk1.8的更多相关文章
- HashMap 源码分析 基于jdk1.8分析
HashMap 源码分析 基于jdk1.8分析 1:数据结构: transient Node<K,V>[] table; //这里维护了一个 Node的数组结构: 下面看看Node的数 ...
- HashMap源码分析-基于JDK1.8
hashMap数据结构 类注释 HashMap的几个重要的字段 hash和tableSizeFor方法 HashMap的数据结构 由上图可知,HashMap的基本数据结构是数组和单向链表或红黑树. 以 ...
- ArrayList 源码分析 基于jdk1.8:
1:数据结构: transient Object[] elementData; //说明内部维护的数据结构是一个Object[] 数组 成员属性: private static final int ...
- LinkedList的源码分析(基于jdk1.8)
1.初始化 public LinkedList() { } 并未开辟任何类似于数组一样的存储空间,那么链表是如何存储元素的呢? 2.Node类型 存储到链表中的元素会被封装为一个Node类型的结点.并 ...
- ArrayList的源码分析(基于jdk1.8)
1.初始化 transient Object[] elementData; //实际存储元素的数组 private static final Object[] DEFAULTCAPACITY_EMPT ...
- AtomicInteger源码分析——基于CAS的乐观锁实现
AtomicInteger源码分析——基于CAS的乐观锁实现 1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时 ...
- 并发-AtomicInteger源码分析—基于CAS的乐观锁实现
AtomicInteger源码分析—基于CAS的乐观锁实现 参考: http://www.importnew.com/22078.html https://www.cnblogs.com/mantu/ ...
- Spring IoC 源码分析 (基于注解) 之 包扫描
在上篇文章Spring IoC 源码分析 (基于注解) 一我们分析到,我们通过AnnotationConfigApplicationContext类传入一个包路径启动Spring之后,会首先初始化包扫 ...
- CopyOnWriteArrayList源码分析
基于jdk1.7源码 一.无锁容器 CopyOnWriteArrayList是JDK5中添加的新的容器,除此之外,还有CopyOnWriteArraySet.ConcurrentHahshMap和Co ...
随机推荐
- python3字符串常用操作练习
练习一下字符串的常用操作 #-*- coding:utf-8 -*- #字符串的常用操作 str = "1111 Hell :wo:rld! " #删除头尾所有指定字符串,默认移除 ...
- HTML5中localStorage的使用
为什么要存在localStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cook ...
- redux的详细介绍和使用!
三层 视图(view)数据商店(store)reducer 流程: 用户操作视图 视图产生action 通过store转发给reducer(同时还会接收store中的数据模型 state) 由redu ...
- es6中find方法
find() 方法返回数组中满足提供的测试函数的第一个元素的值.否则返回 undefined. , , , , ]; var found = array1.find(function(element) ...
- 汇编push,pop
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明.2019-08-24,00:40:12作者By-----溺心与沉浮----博客园 1.BASE,TOP是2个32位的通用寄存器,里面存储的 ...
- Linux环境oracle导库步骤
1.xshell登录linux 2.切换oracle用户 su - oracle 3.创建directory仓库目录,存放数据库dmp文件 //DIRFILE_zy 表示目录名称 后面的是实际地址 c ...
- sed 常用命令 网址
https://wangchujiang.com/linux-command/c/sed.html https://linux.cn/article-11367-1.html https://juej ...
- slf4j 和 logback 的区别
slf4j 和 logback 的区别: slf4j是Java的一个日志门面,实现了日志框架一些通用的api; logback是具体的日志框架.它和log4j是同一个作者,他是为了解决log4j存在的 ...
- LiunxCentos7 上安装 FastDFS
Centos7 上安装 FastDFS 1.安装gcc(编译时需要) FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gc ...
- 【大数据】0001---使用SparkSQL关联两个表求和取前几行
场景: 有两个表,表可以是文本或Json数据,结构化后分别是Table1(A,B,C)和Table2(C.D.E),两个表通过C关联,要求求出D+E之和,并以(A.B.D+E)三列返回 解答: 思路: ...