测试代码:

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;}@Overridepublic 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 写时拷贝容器CopyOnWriteArrayList的测试相关推荐

  1. Java 写时复制容器 —— CopyOnWriteArrayList

    引言 写时复制的含义是当容器发生修改操作时,如add() 等,就会将原来的容器整体复制一份,这个过程是加锁的.而如果只是读取资源,例如 get() ,就不会受到任何同步要求的限制. 写时复制的理念是, ...

  2. Java写时复制CopyOnWriteArrayList

    Java写时复制CopyOnWriteArrayList Copy-On-Write是一种程序设计的优化方法,多线程在不修改对象时可以共享一个对象地址空间,如果某一个线程要求修改对象时,需要首先将原来 ...

  3. 浅拷贝+引用计数--写时拷贝---模拟实现string容器

    引用计数 深拷贝 多个对象共享同一份资源时,最后能够保证该资源只被释放一次 应该由哪个对象释放资源? 由最后一个使用该资源的对象去释放 怎么知道一个对象是最后一个使用该资源的对象? 给一个计数,记录使 ...

  4. 写时复制,写时拷贝,写时分裂,Copy on write

    2019独角兽企业重金招聘Python工程师标准>>> 写时复制,写时拷贝,写时分裂 (Copy-on-write,简称COW)是计算机资源管理方面的一种优化技术,有着广泛的应用,比 ...

  5. php zval_copy_static_var(),zval _ 引用计数 _ 变量分离 _ 写时拷贝

    zval.引用计数.变量分离.写时拷贝 我们一步步来理解 1.php语言特性 PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都 ...

  6. 写时拷贝(Copy On Write)方案详解

    本文旨在通过对 写时拷贝 的四个方案(Copy On Write)分析,让大家明白写时拷贝的实现及原理. 关于浅拷贝与深拷贝,我在之前的博客中已经阐述过了  浅拷贝容易出现指针悬挂的问题,深拷贝效率低 ...

  7. C++ 写时拷贝 3

    http://blog.csdn.net/ljianhui/article/details/22895505 字符串一种在程序中经常要使用到的数据结构,然而在C中却没有字符串这种类型.在C++中,为了 ...

  8. String写时拷贝实现

    头文件部分 1 /* 2 版权信息:狼 3 文件名称:String.h 4 文件标识: 5 摘 要:对于上版本简易的String进行优化跟进. 6 改进 7 1.(将小块内存问题与大块分别对待)小内存 ...

  9. 写时拷贝/写时复制技术

    拷贝控制 C++提供两个拷贝控制函数 拷贝构造函数 拷贝赋值运算符重载 例如:String类 class String{public:String(const char* str = NULL);St ...

最新文章

  1. 可持久化线段树(静态)【学习笔记】
  2. 《人工智能北京共识》发布,全文公开
  3. 4、自定义部分国家语言代号对照表
  4. sql server 索引学习1
  5. 【CTF大赛】陇剑杯-机密内存-解题过程分析
  6. IE6下z-index犯癫不起作用bug的初步研究
  7. 记录奥运-当今五大Java记录框架之间的竞赛
  8. 每日一问:Android 滑动冲突,你们都是怎样处理的
  9. domino从Excel导入数据
  10. 后端开发常用框架文档及中文翻译
  11. Spring boot :使用 Swagger 2 构建 RESTful APIs
  12. 【理财】【学校财务信息管理系统】一卡通网络金融化
  13. FRR BGP协议分析15 -- 路由策略
  14. Scala下载和配置
  15. 解决诺顿不显示盾牌图标方法
  16. listmanager htdocs
  17. 【史上最全 | 编程入门指南无标题】
  18. 函数连续、可导、可微、连续可微
  19. 开启TX2、Xavier最大性能 Opening the Max performance of TX2、Xavier
  20. 如何测试一个一次性水杯

热门文章

  1. MySQL的诡异同步问题-重复执行一条relay-log
  2. 适合网页设计师的11个不错的Chrome插件
  3. 网络编程之网络架构及其演变过程、互联网与互联网的组成、OSI七层协议、socket抽象层...
  4. IntelliJ IDEA 2019 激活码 | 全产品 | 跨平台 | Goland | PhpStorm | Rider | CentOS | Windows
  5. 安装 Python-Client
  6. ie9 background 不显示
  7. JMeter正则表达式-学习(3)
  8. 最优化导论(part2)--对偶问题的性质
  9. CSS基础(part16)--CSS用户界面样式
  10. Django从理论到实战(part5)--创建我们的第一个应用