CopyOnWriteArrayList笔记
一、前言
Java 5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。
ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表。对与多线程的操作,介于HashMap 与Hashtable 之间。jdk1.8之前内部采用“锁分段”机制替代Hashtable 的独占锁。进而提高性能,jdk1.8之后采用CAS算法。
此包还提供了设计用于多线程上下文中的Collection 实现:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和CopyOnWriteArraySet。当期望许多线程访问一个给定collection 时,ConcurrentHashMap 通常优于同步的HashMap,ConcurrentSkipListMap 通常优于同步的TreeMap。当期望的读数和遍历远远大于列表的更新数时,CopyOnWriteArrayList 优于同步的ArrayList。
这里重点记录CopyOnWriteArrayList
二、CopyOnWriteArrayList代码示例
1 package me.concurrrent.chm; 2 3 import java.util.Iterator; 4 import java.util.concurrent.CopyOnWriteArrayList; 5 6 /** 7 * CopyOnWriteArrayList/CopyOnWriteArraySet : “写入并复制” 8 * CopyOnWriteArrayList,当每次写入时,都会在底层完成复制,复制一个新的链表,然后再进行添加,这样开销大,效率低 9 * 考虑线程安全问题时选择它,添加操作多时不适合选它。它适合并发迭代操作 10 */ 11 public class TestCopyOnWriteArrayList { 12 13 public static void main(String[] args) { 14 HelloThread ht = new HelloThread(); 15 16 for (int i = 0; i < 10; i++) { 17 new Thread(ht).start(); 18 } 19 } 20 21 } 22 23 class HelloThread implements Runnable { 24 25 /** 26 * jdk1.5之前只能这样操作,由于迭代器和List操作的同一个数据源,会引发并发修改异常 27 * private static List <String> list = Collections.synchronizedList(new ArrayList<String>()); 28 */ 29 private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); 30 31 static { 32 list.add("AA"); 33 list.add("BB"); 34 list.add("CC"); 35 } 36 37 @Override 38 public void run() { 39 40 Iterator<String> it = list.iterator(); 41 42 while (it.hasNext()) { 43 System.out.println(it.next()); 44 45 //迭代时同时添加元素 46 list.add("AA"); 47 } 48 49 } 50 51 }
如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。转载请注明出处和链接地址,欢迎转载,谢谢!