`

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);
}

 

分享到:
评论

相关推荐

    Java线程创建与管理:深入理解与实践指南

    ### Java线程创建与管理:深入理解与实践指南 #### 引言 多线程作为Java程序设计中的重要概念之一,使开发者能够构建并行执行的任务,进而提高程序的效率和响应速度。Java语言提供了丰富的工具和技术来支持线程的...

    Java面试题详细(校招版)

    1. 字节流与字符流:理解字节流和字符流的区别,知道何时使用InputStream和OutputStream,何时使用Reader和Writer。 2. 文件操作:掌握File类的常用方法,理解文件的读写操作。 3. 缓冲流:理解BufferedReader和...

    java企业的面试题

    2. **内存管理与垃圾回收**:理解Java内存模型,包括堆内存、栈内存、方法区和本地方法栈;了解垃圾回收机制,如GC的工作原理、新生代与老年代的区别、Minor GC和Full GC。 3. **多线程**:掌握线程的创建方式,如...

    Java并发编程最全面试题 123道

    6. ExecutorService与ThreadPoolExecutor:掌握如何创建和管理线程池,理解线程池的核心参数如corePoolSize、maximumPoolSize、keepAliveTime等。 7. Future和Callable:学习使用Future获取Callable任务的结果,实现...

    一些面试题【Java后端】

    - ConcurrentHashMap与CopyOnWriteArrayList:掌握并发集合的特性和使用场景。 4. **多线程**: - 创建线程:通过Thread类和Runnable接口创建线程。 - 线程同步:理解synchronized关键字,以及wait()、notify()...

    1000道 互联网Java工程师面试题 485页

    - CopyOnWriteArrayList与ConcurrentHashMap:探讨线程安全的集合类。 6. **多线程** - 线程创建:通过Thread类和Runnable接口创建线程。 - 线程同步:理解synchronized关键字、wait/notify机制以及Lock接口。 ...

    对参数 对象的理解方法

    ### 对参数与对象方法的理解 #### 一、参数与对象的基本概念 在计算机编程中,尤其是在面向对象的语言如Java中,参数与对象是两个非常重要的概念。为了更好地理解和使用它们,我们首先需要明确这两个概念的基本...

    java面试题

    - CopyOnWriteArrayList与ConcurrentHashMap:它们在并发环境下的应用和性能优势。 3. **多线程**: - 线程状态:理解新建、就绪、运行、阻塞和死亡等五种线程状态。 - 同步机制:掌握synchronized关键字,了解...

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

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

    【电子版】Java校招面试题库(附答案与解析)java篇.zip

    - 类与对象:理解面向对象编程的基本概念,如封装、继承、多态。 - 内存管理:理解垃圾收集机制,了解堆和栈的区别。 - 异常处理:学习如何使用try-catch-finally语句块进行异常处理。 - 数据类型:掌握基本数据...

    java达内面试题库

    4. 线程池:ExecutorService和ThreadPoolExecutor的理解与使用。 5. 原子性:Atomic类的理解,以及在并发编程中的应用。 五、IO流 1. 字节流与字符流:了解InputStream、OutputStream、Reader、Writer四大流,以及...

    Java编程语言中的数据结构与算法:深入理解与实践指南.zip

    通过深入理解和实践Java中的数据结构与算法,开发者可以编写出更高效、更优雅的代码,解决复杂的编程挑战。在Algorithm-master这个项目中,很可能是包含了一系列练习和示例代码,帮助学习者通过实际操作来巩固这些...

    Java开发的面试题.zip

    10. **并发编程**:理解并发容器(如ConcurrentHashMap、CopyOnWriteArrayList等),线程安全的数据结构,以及并发工具类(如Semaphore、CyclicBarrier、CountDownLatch等)。 11. **Spring框架**:理解Spring的...

    java就业面试宝典

    4. 继承与多态:理解单继承与多层继承,以及多态在方法重写和重载中的体现。 5. 接口与内部类:理解接口的用途,以及匿名内部类、静态内部类和成员内部类的应用。 三、集合框架 1. List、Set与Map:熟练使用...

    Java 并发核心编程

    2. **CopyOnWriteArrayList**: 一种特殊的列表实现,通过复制现有数组并在复制副本上进行修改来支持线程安全。 3. **ConcurrentLinkedQueue**: 提供了一个基于链表的无界队列实现,适用于高并发场景。 #### 五、...

    7.深圳各公司JAVA面试题综合

    - 类与对象:理解面向对象的基本概念,包括封装、继承和多态。 - 构造器:了解构造器的作用,以及默认构造器和自定义构造器的使用。 - 异常处理:掌握try-catch-finally语句块,理解Checked异常和Unchecked异常的...

    最全的JAVA面试题汇总 JAVA面试题精华 内置答案

    - **堆内存与栈内存**:理解对象在内存中的分配,以及局部变量与实例变量的区别。 - **GC(Garbage Collection)**:了解垃圾回收的基本原理,如可达性分析,何时触发垃圾回收,以及如何优化内存管理。 3. **异常...

    java 常用面试题,面试刷题必备

    - 类与对象:理解面向对象编程的基本概念,包括封装、继承和多态。 - 构造器:了解构造函数的作用以及何时使用无参和带参数的构造器。 - 数据类型:区分基本数据类型与引用数据类型,掌握它们的范围和默认值。 -...

    Java面试宝典

    3. **集合框架**:包括ArrayList、LinkedList、HashSet、HashMap等容器的理解与使用,掌握List、Set、Map接口的差异,了解并发环境下集合的线程安全问题,以及对CopyOnWriteArrayList、ConcurrentHashMap等并发集合...

    面试题 java方向 新版

    - 类与对象:理解面向对象编程的基本概念,如封装、继承、多态。 - 异常处理:了解如何使用try-catch-finally语句块处理程序中的异常。 - 内存管理:理解堆和栈的区别,以及垃圾回收机制。 - 数据类型:深入理解...

Global site tag (gtag.js) - Google Analytics