Java 写时拷贝容器CopyOnWriteArrayList的测试
2023-09-14 09:03:51 时间
测试代码:
package copyOnWriteArrayListTest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class AddThread implements Runnable {
private List<Double> list;
public AddThread(List<Double> list) {
this.list = list;
}
@Override
public void run(){
for ( int i = 0; i < 10000; i++){
list.add(Math.random());
}
}
}
public class CopyOnWriteArrayListTest {
public static final int THREAD_POOL_SIZE = 2;
public static void main(String[] args) throws InterruptedException {
// List<Double> list = new ArrayList<>();
List<Double> list = new CopyOnWriteArrayList<>();
ExecutorService es = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
es.execute(new AddThread(list));
es.execute(new AddThread(list));
es.shutdown();
Thread.sleep(4000);
System.out.println("OK, list length: " + list.size());
}
}
输出结果:
OK, list length: 20000
如果把支持写时拷贝的list替换成普通的ArrayList:
List list = new ArrayList<>();
因为两个线程同时对这个普通的ArrayList进行写操作,结果如下:
OK, list length: 17578
看下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) {
synchronized (lock) {
Object[] es = getArray();
int len = es.length;
es = Arrays.copyOf(es, len + 1);
es[len] = e;
setArray(es);
return true;
}
}
lock初始化的地方:
final transient Object lock = new Object();
相关文章
- Java链表应用
- java 实现 按位异或_Java 按位异或的性质及其妙用
- java 二维数组 arraycopy_Java对数组的复制[通俗易懂]
- java集合类面试题_Java集合类相关面试题
- java中random方法取值范围_Java Random.nextInt()方法,随机产生某个范围内的整数
- java 构造器 构造方法_Java构造器(构造方法/constructor)
- java的遍历数组效率测试源码[通俗易懂]
- Java的定时器_JAVA定时任务
- java 测试程序代码运行时间过长_Java测试
- java h2 数据库_Java H2数据库
- java销毁定时器_Java 定时器退出解决方案
- java帝国时代_我的第一个java程序
- 【原创】Java基础知识②--第一个Java程序以及Java程序特殊规范
- java算术运算符(二)
- 用Java技术创建RESTful Web服务详解架构师
- Java使用Spring发邮件详解编程语言
- 策略Java实现Redis过期策略的探索(redisjava过期)
- 策略Java实现Redis过期策略(redisjava过期)
- 使用Java实现Redis数据存储(redis集成java)
- 使用Java轻松导出MySQL数据(java导出mysql)
- Linux系统如何配置Java?(linux下配置java)
- MySQL与Java的数据交互之旅(mysql对应java)
- Linux下Java应用打包实践(linux java打包)
- Linux系统下Java软件环境搭建指导(linux java软件)
- Java模拟Oracle实现稳定数据库性能(java模仿oracle)
- Java导出Oracle数据提升数据分析流程效率(java导出oracle)
- Oracle中实现Java程序设计的极限可能性(oracle中的java)
- C#调用Java类的实现方法
- java使用正则表达为数字添加千位符的简单方法