JUC-4-CopyOnWriteArrayList

什么是CopyOnWrite容器
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
 
CopyOnWriteArrayList/CopyOnWriteArraySet 
注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大。并发迭代操作多时可以选择。
 
 
 
 
并发修改异常java.util.ConcurrentModificationException!即,产生fail-fast事件!
  
 
 
使用CopyOnWriteArrayList  解决并发
 
 
 1 package com.wf.zhang.juc;
 2 
 3 import java.util.Iterator;
 4 import java.util.concurrent.CopyOnWriteArrayList;
 5 
 6 /*
 7      * CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制”
 8      * 注意:添加操作多时,效率低,因为每次添加时都会进行复制,开销非常的大。并发迭代操作多时可以选择。
 9      */
10     public class TestCopyOnWriteArrayList {
11 
12         public static void main(String[] args) {
13             HelloThread ht = new HelloThread();
14 
15             for (int i = 0; i < 10; i++) {
16                 new Thread(ht).start();
17             }
18         }
19 
20     }
21 
22     class HelloThread implements Runnable{
23 
24     //private static List<String> list = Collections.synchronizedList(new ArrayList<String>());
25 
26        private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
27 
28         static{
29             list.add("AA");
30             list.add("BB");
31             list.add("CC");
32         }
33 
34         @Override
35         public void run() {
36 
37             Iterator<String> it = list.iterator();
38 
39             while(it.hasNext()){
40                 System.out.println(it.next());
41 
42                 list.add("AA");
43             }
44 
45         }
46 
47     }
View Code

 

posted @ 2019-11-24 17:07  wf.zhang  阅读(178)  评论(0编辑  收藏  举报