博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CopyOnWriteArrayList 学习笔记
阅读量:4688 次
发布时间:2019-06-09

本文共 2680 字,大约阅读时间需要 8 分钟。

先简单说一下CopyOnWrite是什么意思?

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了

两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的并发场景中使用到。

 

下面自己写了两个例子基本可以说明其作用

例一:不使用CopyOnWriteArrayList

package com.dushu817.exprise.javaexprise.concurrent.copyonwrite;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.concurrent.TimeUnit;public class NoUseCopyOnWriteTest {    static List
task = new ArrayList<>(); static void initTask() { task.add("1"); task.add("2"); task.add("3"); } public static void main(String[] args) { // 初始化任务队列 initTask(); // 获取任务队列迭代器 Iterator
iter = task.iterator(); // 启动子线程 new Thread(()->{ task.add("4"); }).start(); // 主线程等待 try { TimeUnit.SECONDS.sleep(1); } catch (Exception e) { e.printStackTrace(); } // 遍历任务队列 while (iter.hasNext()) { System.out.println(iter.next()); } // 重新遍历 iter = task.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } } }

执行会抛异常   

 

例二:使用CopyOnWriteArrayList

package com.dushu817.exprise.javaexprise.concurrent.copyonwrite;import java.util.Iterator;import java.util.List;import java.util.concurrent.CopyOnWriteArrayList;import java.util.concurrent.TimeUnit;public class CopyOnWriteTest {    static List
task = new CopyOnWriteArrayList<>(); static void initTask() { task.add("1"); task.add("2"); task.add("3"); } public static void main(String[] args) { // 初始化任务队列 initTask(); // 获取任务队列迭代器 Iterator
iter = task.iterator(); // 启动子线程 new Thread(()->{ task.add("4"); }).start(); // 主线程等待 try { TimeUnit.SECONDS.sleep(1); } catch (Exception e) { e.printStackTrace(); } // 遍历任务队列 while (iter.hasNext()) { System.out.println(iter.next()); } // 重新遍历 iter = task.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); } } }

执行结果:

 

可以看到,第一次遍历时,虽然集合中的元素已经修改,但是迭代器中的元素仍为初始值。第二次遍历才变成修改后的值。

 

这两个例子同时也说明了CopyOnWrite的一个缺点,数据不能保证实时一致,但是最终会一致。如果希望写入的数据可以马上读到,请不要使用CopyOnWrite

posted on
2017-01-22 15:41 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/yinkh/p/6340509.html

你可能感兴趣的文章
ArrayList和LinkedList和Vector源码分析
查看>>
webservice整合spring cxf
查看>>
再次编译这个应用程序应该不会有问题
查看>>
Ubuntu-tomcat7目录
查看>>
189. Rotate Array
查看>>
使用ASP.Net WebAPI构建REST服务(六)——Self-Host
查看>>
asp.net 的三种开发模式
查看>>
Android 交叉编译 IPerf3
查看>>
Android原生Gallery关于图像Orientation的问题
查看>>
Android开发之ViewPager
查看>>
【NOIP2017】列队【可持久化线段树】
查看>>
python学习——通过while循环语句实现九九乘法表的四种表达方式
查看>>
[解题报告] 100 - The 3n + 1 problem
查看>>
MvvmCross[翻译] 使用Xamarin与MvvmCross完成一个跨平台App
查看>>
Entity Framework 学习高级篇1—改善EF代码的方法(上)
查看>>
027-chown命令
查看>>
Python 线程、进程和协程
查看>>
赛普系统自动拨号
查看>>
platform_device与platform_driver
查看>>
[iOS] iPad与iPhone上各种标准控件的大小
查看>>