CopyOnWriteArrayList笔记

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 }
View Code

如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

转载请注明出处和链接地址,欢迎转载,谢谢!

原文地址:https://www.cnblogs.com/albertrui/p/8401160.html