FROM:http://www.cnblogs.com/alipayhutu/archive/2012/08/11/2634073.html
CopyOnWriteArrayList,因何而存在?
ArrayList的一个线程安全的变体,其所有可变操作(add、set 等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。
CopyOnWriteArrayList,是因”并发”而生。
CopyOnWriteArrayList,改了其中的某对象的某个值,
【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除,会报错。
<!--CRLF-->// 删除/修改元素
<!--CRLF-->for(String item : list){
<!--CRLF-->list.remove(item);
<!--CRLF-->}
<!--CRLF-->
解决办法一:使用迭代器,一边遍历,一边删除,不会报错。
// 删除/修改元素
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();
}
解决办法一:使用直接方式,一边遍历,一边add/remove()
for(String item : list){
String tem = item + "...";
list.remove(item);
list.add(tem);
}
相关推荐
### Java线程创建与管理:深入理解与实践指南 #### 引言 多线程作为Java程序设计中的重要概念之一,使开发者能够构建并行执行的任务,进而提高程序的效率和响应速度。Java语言提供了丰富的工具和技术来支持线程的...
1. 字节流与字符流:理解字节流和字符流的区别,知道何时使用InputStream和OutputStream,何时使用Reader和Writer。 2. 文件操作:掌握File类的常用方法,理解文件的读写操作。 3. 缓冲流:理解BufferedReader和...
2. **内存管理与垃圾回收**:理解Java内存模型,包括堆内存、栈内存、方法区和本地方法栈;了解垃圾回收机制,如GC的工作原理、新生代与老年代的区别、Minor GC和Full GC。 3. **多线程**:掌握线程的创建方式,如...
6. ExecutorService与ThreadPoolExecutor:掌握如何创建和管理线程池,理解线程池的核心参数如corePoolSize、maximumPoolSize、keepAliveTime等。 7. Future和Callable:学习使用Future获取Callable任务的结果,实现...
- ConcurrentHashMap与CopyOnWriteArrayList:掌握并发集合的特性和使用场景。 4. **多线程**: - 创建线程:通过Thread类和Runnable接口创建线程。 - 线程同步:理解synchronized关键字,以及wait()、notify()...
- CopyOnWriteArrayList与ConcurrentHashMap:探讨线程安全的集合类。 6. **多线程** - 线程创建:通过Thread类和Runnable接口创建线程。 - 线程同步:理解synchronized关键字、wait/notify机制以及Lock接口。 ...
### 对参数与对象方法的理解 #### 一、参数与对象的基本概念 在计算机编程中,尤其是在面向对象的语言如Java中,参数与对象是两个非常重要的概念。为了更好地理解和使用它们,我们首先需要明确这两个概念的基本...
- CopyOnWriteArrayList与ConcurrentHashMap:它们在并发环境下的应用和性能优势。 3. **多线程**: - 线程状态:理解新建、就绪、运行、阻塞和死亡等五种线程状态。 - 同步机制:掌握synchronized关键字,了解...
8.初识Lock与AbstractQueuedSynchronizer(AQS) 9.深入理解AbstractQueuedSynchronizer(AQS) 10.彻底理解ReentrantLock 11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13....
- 类与对象:理解面向对象编程的基本概念,如封装、继承、多态。 - 内存管理:理解垃圾收集机制,了解堆和栈的区别。 - 异常处理:学习如何使用try-catch-finally语句块进行异常处理。 - 数据类型:掌握基本数据...
4. 线程池:ExecutorService和ThreadPoolExecutor的理解与使用。 5. 原子性:Atomic类的理解,以及在并发编程中的应用。 五、IO流 1. 字节流与字符流:了解InputStream、OutputStream、Reader、Writer四大流,以及...
通过深入理解和实践Java中的数据结构与算法,开发者可以编写出更高效、更优雅的代码,解决复杂的编程挑战。在Algorithm-master这个项目中,很可能是包含了一系列练习和示例代码,帮助学习者通过实际操作来巩固这些...
10. **并发编程**:理解并发容器(如ConcurrentHashMap、CopyOnWriteArrayList等),线程安全的数据结构,以及并发工具类(如Semaphore、CyclicBarrier、CountDownLatch等)。 11. **Spring框架**:理解Spring的...
4. 继承与多态:理解单继承与多层继承,以及多态在方法重写和重载中的体现。 5. 接口与内部类:理解接口的用途,以及匿名内部类、静态内部类和成员内部类的应用。 三、集合框架 1. List、Set与Map:熟练使用...
2. **CopyOnWriteArrayList**: 一种特殊的列表实现,通过复制现有数组并在复制副本上进行修改来支持线程安全。 3. **ConcurrentLinkedQueue**: 提供了一个基于链表的无界队列实现,适用于高并发场景。 #### 五、...
- 类与对象:理解面向对象的基本概念,包括封装、继承和多态。 - 构造器:了解构造器的作用,以及默认构造器和自定义构造器的使用。 - 异常处理:掌握try-catch-finally语句块,理解Checked异常和Unchecked异常的...
- **堆内存与栈内存**:理解对象在内存中的分配,以及局部变量与实例变量的区别。 - **GC(Garbage Collection)**:了解垃圾回收的基本原理,如可达性分析,何时触发垃圾回收,以及如何优化内存管理。 3. **异常...
- 类与对象:理解面向对象编程的基本概念,包括封装、继承和多态。 - 构造器:了解构造函数的作用以及何时使用无参和带参数的构造器。 - 数据类型:区分基本数据类型与引用数据类型,掌握它们的范围和默认值。 -...
3. **集合框架**:包括ArrayList、LinkedList、HashSet、HashMap等容器的理解与使用,掌握List、Set、Map接口的差异,了解并发环境下集合的线程安全问题,以及对CopyOnWriteArrayList、ConcurrentHashMap等并发集合...
- 类与对象:理解面向对象编程的基本概念,如封装、继承、多态。 - 异常处理:了解如何使用try-catch-finally语句块处理程序中的异常。 - 内存管理:理解堆和栈的区别,以及垃圾回收机制。 - 数据类型:深入理解...