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 */
原文地址:https://www.cnblogs.com/rojas/p/5351952.html