`

CopyOnWriteArrayList理解与理解[转]

    博客分类:
  • java
 
阅读更多

FROM:http://www.cnblogs.com/alipayhutu/archive/2012/08/11/2634073.html

CopyOnWriteArrayList理解与理解

 

雨伞 CopyOnWriteArrayList,因何而存在?

ArrayList的一个线程安全的变体,其所有可变操作(addset 等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。

 

CopyOnWriteArrayList,是因”并发”而生。

 

 

CopyOnWriteArrayList,改了其中的某对象的某个值,

 

【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除,会报错。

<!--CRLF-->
 // 删除/修改元素
<!--CRLF-->
 for(String item : list){
<!--CRLF-->
     list.remove(item);
<!--CRLF-->
 }
<!--CRLF-->

 

 

image

 

雨伞 解决办法一:使用迭代器,一边遍历,一边删除,不会报错。

// 删除/修改元素
Iterator<String> it = list.iterator();
while(it.hasNext()){
    String ele = it.next();
    it.remove();
}

http://blog.sina.com.cn/s/blog_605f5b4f0100qsgf.html

 

雨伞 解决办法二:使用CopyOnWriteArrayList,直接方式,一边遍历,一会删除,不会报错。

for(String item : list){
    list.remove(item);
}

 

 

【场景二】对于ArrayList,使用迭代器,一边遍历,一边add,会报错。

Iterator<String> it = list.iterator();
while(it.hasNext()){
    String str = it.next();
    String tem = str + "...";
    list.add(tem);
}

雨伞 解决办法一:改用CopyOnWriteArrayList,直接方式,一边遍历,一边add,不会报错。

for(String item : list){
    String tem = item + "...";
    list.add(tem);
}

雨伞 解决办法二:改用CopyOnWriteArrayList,一边遍历,一边add,不会报错。

        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String str = it.next();
            String tem = str + "...";
            list.add(tem);
        }

 

【场景三】对于CopyOnWriteArrayList,迭代器,不能remove。

Iterator<String> it = list.iterator();
while(it.hasNext()){
    String str = it.next();
    String tem = str + "...";
    it.remove();
}

image

雨伞 解决办法一:使用直接方式,一边遍历,一边add/remove()

for(String item : list){
    String tem = item + "...";
    list.remove(item);
    list.add(tem);
}

 

分享到:
评论

相关推荐

    【2018最新最详细】并发多线程教程

    8.初识Lock与AbstractQueuedSynchronizer(AQS) 9.深入理解AbstractQueuedSynchronizer(AQS) 10.彻底理解ReentrantLock 11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13....

    Java并发编程原理与实战

    并发容器CopyOnWriteArrayList原理与使用.mp4 并发容器ConcurrentLinkedQueue原理与使用.mp4 Java中的阻塞队列原理与使用.mp4 实战:简单实现消息队列.mp4 并发容器ConcurrentHashMap原理与使用.mp4 线程池的原理与...

    Java 并发编程原理与实战视频

    第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:...

    龙果 java并发编程原理实战

    第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:...

    龙果java并发编程完整视频

    第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:...

    java并发编程

    第47节并发容器CopyOnWriteArrayList原理与使用00:15:52分钟 | 第48节并发容器ConcurrentLinkedQueue原理与使用00:31:03分钟 | 第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:...

    java二叉树算法源码-JavaCore:Java核心知识。集合框架、JVM机制、多线程与并发框架、网络协议、SSM框架、MySQL、分布式、

    源码分析:CopyOnWriteArrayList 与 CopyOnWriteArraySet 二、:radio::radio::radio:JVM(Java虚拟机) Java虚拟机 (第 06 篇) 深入理解:类文件结构 Java虚拟机 (第 08 篇) 深入理解:打破双亲委派模型 三、:...

    Java并发编程基础.pdf

    线程与线程状态:理解Java中线程的基本概念,包括线程的创建、启动、暂停、恢复和终止。熟悉线程的生命周期及其不同状态,如新建、就绪、运行、阻塞和死亡。 线程同步与通信:掌握Java中的同步机制,如synchronized...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段09讲、多线程与JVM内存结构的关系,虚拟机栈实验.mp4 │ 高并发编程第一阶段10讲、Thread构造函数StackSize详细讲解.mp4 │ 高并发编程第一阶段11讲、Thread构造函数StackSize详细讲解-续....

    2018年面试实战总结.zip

    2018/10/06 周六 上午 11:12 99,815 深入理解JVM总结-垃圾收集器与内存分 配策略.docx 2018/10/06 周六 下午 19:36 1,761 算法和数据结构--目录.txt 2018/09/30 周日 下午 13:24 36,996 线程安全的...

    TanTanRippleView-仿探探进入 扫描view.zip

     @NonNull @ColorInt int colors[], @Nullable float positions[])重点在于positions 的理解。按照文档解释以及代码。 比如跟colors 的值一一对应,还必须是单调递增的,防止出现严重异常。 positions 对应每...

Global site tag (gtag.js) - Google Analytics