java.util.concurrent.CopyOnWriteArrayList

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5 import java.util.concurrent.CopyOnWriteArrayList;
 6
 7 public class TestCalc {
 8     /**
 9      *read
10      */
11     private static class ReadTask implements Runnable {
12         List<String> list;
13
14         public ReadTask(List<String> list) {
15             this.list = list;
16         }
17
18         public void run() {
19             for (String str : list) {
20                 System.out.println(str);
21             }
22         }
23     }
24     /**
25      *write
26      *
27      */
28     private static class WriteTask implements Runnable {
29         List<String> list;
30         int index;
31
32         public WriteTask(List<String> list, int index) {
33             this.list = list;
34             this.index = index;
35         }
36
37         public void run() {
38             list.remove(index);
39             list.add(index, "write_" + index);
40         }
41     }
42
43     public void run() {
44         final int NUM = 10;
45          //List<String> list = new ArrayList<String>(); //java.util.ConcurrentModificationException
46          CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
47         for (int i = 0; i < NUM; i++) {
48             list.add("main_" + i);
49         }
50         ExecutorService executorService = Executors.newFixedThreadPool(NUM);
51         for (int i = 0; i < NUM; i++) {
52             executorService.execute(new ReadTask(list));
53             executorService.execute(new WriteTask(list, i));
54         }
55         executorService.shutdown();
56     }
57
58     public static void main(String[] args) {
59         new TestCalc().run();
60     }
61 }
62
63 /*
64
65  //List<String> list = new ArrayList<String>();
66 Exception in thread "pool-1-thread-11" java.util.ConcurrentModificationException
67
68         at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
69         at java.util.ArrayList$Itr.next(Unknown Source)
70         at TestCalc$ReadTask.run(TestCalc.java:19)
71         at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
72         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
73         at java.lang.Thread.run(Unknown Source)
74 */
时间: 2024-10-25 02:27:48

java.util.concurrent.CopyOnWriteArrayList的相关文章

《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet

CopyOnWriteArrayList和CopyOnWriteArraySet从数据结构类型上来说是类似的,都是用数组实现的保存一组数据的数据结构,区别也简单就是List和set的区别.因此这里就先讨论CopyOnWriteArrayList,然后再说CopyOnWriteArraySet. 这里重点关注的是CopyOnWrite,从字面上很容易理解,每当写操作的时候复制存储数据的数组,把拷贝上修改完再覆盖原先的数组.那么这样的数据结构适用的情况必然是读操作占绝大多数(很少进行写操作),且数据

java.util.concurrent介绍

(本文由 blog博主Caoer(草儿)原创,此处为转载. ) java.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作.通过提供一组可靠的.高性能并发构建块,开发人员可以提高并发类的线程安全.可伸缩性.性能.可读性和可靠性. 如果一些类名看起来相似,可能是因为 java.util.concurrent 中的许多概念源自 Doug L

java.util.concurrent并发包诸类概览

java.util.concurrent包的类都来自于JSR-166:Concurrent Utilities,官方的描述叫做“The JSR proposes a set of medium-level utilities that provide functionality commonly needed in concurrent programs. ”.作者是大名鼎鼎的Doug Lea,这个包的前身可以在这里找到,它最好的文档就是系统的API手册. 当然,这里参考的concurrent包

《java.util.concurrent 包源码阅读》 结束语

<java.util.concurrent 包源码阅读>系列文章已经全部写完了.开始的几篇文章是根据自己的读书笔记整理出来的(当时只阅读了部分的源代码),后面的大部分都是一边读源代码代码,一边写文章. 由于水平有限,在阅读源代码的时候,分析得也比较浅显,也有很多地方自己也没有研究明白,文章有的地方显得语焉不详,只能请各位多多见谅了. 后面会继续写一些关于Java并发编程的文章,希望各位多多指教. 这里整理了一个简单的目录,包含了本系列所有文章的链接: <java.util.concurr

关于 java.util.concurrent 您不知道的 5 件事--转

第 1 部分 http://www.ibm.com/developerworks/cn/java/j-5things4.html Concurrent Collections 是 Java™ 5 的巨大附加产品,但是在关于注释和泛型的争执中很多 Java 开发人员忽视了它们.此外(或者更老实地说),许多开发人员避免使用这个数据包,因为他们认为它一定很复杂,就像它所要解决的问题一样. 事实上,java.util.concurrent 包含许多类,能够有效解决普通的并发问题,无需复杂工序.阅读本文,

java.util.concurrent包

在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Executor.ExecutorService框架 从Executor接口开始,到ExecutorService,再到很多基于ThreadPoolExecutor实现的具体执行器.执行器实际上是采用了一种叫做命令模式的设计,将任务Runnable和具体执行线程相分离,并给出了生命周期等管理方法,一般只要e

java.util.concurrent介绍【转】

java.util.concurrent介绍 java.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作.通过提供一组可靠的.高性能并发构建块,开发人员可以提高并发类的线程安全.可伸缩性.性能.可读性和可靠性. 如果一些类名看起来相似,可能是因为 java.util.concurrent 中的许多概念源自 Doug Lea 的 util

你所不知道的五件事情--java.util.concurrent(第一部分)

                                                            这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.05.24最后更新) 摘要:编写既要性能良好又要防止应用崩溃的多线程代码确实很难--这也正是我们需要java.util.concurrent的原因.Ted Neward向你展示了像CopyOnWriteArr

高并发第八弹:J.U.C起航(java.util.concurrent)

java.util.concurrent是JDK自带的一个并发的包主要分为以下5部分: 并发工具类(tools) 显示锁(locks) 原子变量类(aotmic) 并发集合(collections) Executor线程执行器 我们今天就说说 并发集合,除开 Queue,放在线程池的时候讲 先介绍以下 CopyOnWrite: Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy