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 }
古人学问无遗力,少壮工夫老始成。
纸上得来终觉浅,绝知此事要躬行。