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 */