A simple one from http://www.ibm.com/developerworks/java/library/j-tiger06164.html.
import java.util.*;
import java.util.concurrent.*;
public class CopyOnWrite {
public static void main(String args[]) {
List list1 = new CopyOnWriteArrayList(Arrays.asList(args));
List list2 = new ArrayList(Arrays.asList(args));
Iterator itor1 = list1.iterator();
Iterator itor2 = list2.iterator();
list1.add("New");
list2.add("New");
try {
printAll(itor1);
} catch (ConcurrentModificationException e) {
System.err.println("Shouldn't get here");
}
try {
printAll(itor2);
} catch (ConcurrentModificationException e) {
System.err.println("Will get here.");
}
}
private static void printAll(Iterator itor) {
while (itor.hasNext()) {
System.out.println(itor.next());
}
}
}
A complex example using multiple threads.
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
public class MultiThreads {
public static void main(String[] args) throws Exception {
List<Val> ls = new CopyOnWriteArrayList<Val>();
ls.add(new Val(1, 10));
ls.add(new Val(2, 20));
ls.add(new Val(3, 30));
CountDownLatch latch = new CountDownLatch(1);
Walker w = new Walker(ls.iterator(), latch);
Modifer m = new Modifer(ls, latch);
w.start();
m.start();
latch.await();
System.out.println("===========");
Iterator<Val> it = ls.iterator();
while (it.hasNext())
System.out.println("[main] " + it.next());
}
}
class Walker extends Thread {
Iterator<Val> it;
CountDownLatch latch;
Walker(Iterator<Val> it, CountDownLatch latch) {
this.it = it;
this.latch = latch;
}
public void run() {
try {
latch.await();
System.out.println("===========");
while (it.hasNext())
System.out.println("[walker] " + it.next());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
class Modifer extends Thread {
List<Val> ls;
CountDownLatch latch;
public Modifer(List<Val> ls, CountDownLatch latch) {
this.ls = ls;
this.latch = latch;
}
public void run() {
try {
ls.set(0, new Val(1, 100));
ls.remove(2);
ls.add(new Val(3, 300));
ls.add(new Val(4, 400));
latch.countDown();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
class Val {
private int no;
private int age;
public Val(int no, int age) {
this.no = no;
this.age = age;
}
public String toString() {
return "no: " + no + ", age: " + age;
}
}
分享到:
相关推荐
Java并发容器CopyOnWriteArrayList实现原理及源码分析 Java并发容器CopyOnWriteArrayList是Java并发包中提供的一个并发容器,实现了线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现。...
java遍历时可修改的容器CopyOnWriteArrayList
Java中的`CopyOnWriteArrayList`是一个线程安全的列表实现,特别适合于高并发环境下的读多写少的场景。这个类的名字暗示了其工作原理:在修改(写入)时复制原有的数组,然后在新的数组上进行操作,最后将新数组替换...
在Java的并发编程中,CopyOnWriteArrayList 是一个重要的线程安全集合类,它通过写时复制(Copy-On-Write)机制实现了高效的读操作。本文将详细探讨 CopyOnWriteArrayList 的工作原理、优缺点、适用场景以及代码示例...
CopyOnWriteArrayList是Java集合框架中的一个特殊列表,位于`java.util.concurrent`包下,专为并发编程场景设计。它的核心特性在于写时复制(Copy-On-Write)策略,这使得它在多线程环境下提供了良好的性能表现。当...
在Java中,CopyOnWriteArrayList(写入时复制数组列表)是线程安全的集合类,它实现了List接口,并使用了"写入时复制"的策略来保证线程安全性。 CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改...
CopyOnWriteArrayList并发容器 CopyOnWriteArrayList是一种基于Copy-On-Write机制的并发容器,自JDK 1.5开始提供。它的基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把...
Java源码解析CopyOnWriteArrayList的讲解 Java源码解析CopyOnWriteArrayList是Java集合框架中一个非常重要的组件,它提供了一个线程安全的ArrayList变种,用于处理大量读取操作和少量写入操作的场景。在本文中,...
1. CopyOnWriteArrayList的简介 2. COW的设计思想 3. CopyOnWriteArrayList的实现原理 4. 总结 2.读线程间
### Java多线程与并发(14-26)-JUC集合-CopyOnWriteArrayList详解 #### 一、概述 `CopyOnWriteArrayList`是一种线程安全的集合类,它是`ArrayList`的一种特殊版本,主要通过复制底层数组的方式来保证线程安全性。...
目前上传的是CopyOnWriteArrayList.uml类图,包含该类的各个extends、implements的接口或者类
java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。 看如下代码: import java.util.ArrayList; import java.util.List; public class Resource3 { ...
Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
CopyOnWriteArrayList是Java集合框架中的一个重要类,它是ArrayList的线程安全版本,特别适合于读多写少的并发场景。这个类通过一种称为“写时复制”(Copy-On-Write)的技术实现了读写分离,确保了在进行写操作时不会...
Java并发编程是Java开发中的重要领域,它涉及到多线程的使用、同步机制以及线程安全的实现。...在"java 并发编程 code.zip"这个压缩包中,可能包含了各种示例代码,可以帮助我们进一步理解和学习这些概念。
今天不看源码(想看源码的同学可以自己在本机进行查阅),只是大概说一下这三者的区别。方便大家能够在面试的时候说出这三者的不同。 ArrayList方面 ArrayList简介: ArrayList是一种以数组实现的List,它实现了...
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的。主要有以下两个原因: 1、ArrayList 自身的 ...用 JUC 下的 CopyOnWriteArrayList ; 先来看看 Synchron
《CopyOnWriteArrayList与CopyOnWriteArraySet源码解析》 CopyOnWriteArrayList与CopyOnWriteArraySet是Java集合框架中的两种线程安全的数据结构,它们在多线程环境下提供了高效且安全的操作。这两个类源自于`java....