zoukankan      html  css  js  c++  java
  • 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】。

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

  • 相关阅读:
    对象与内存控制1---实例变量和类变量
    数组与内存控制2--数组使用
    数组与内存控制1--数组初始化
    Java 三大特征之--多态
    简述Java面向对象三大特征:封装、继承、多态
    java程序初始化的顺序
    关于public static void main(String[] args)相关知识
    Java的优点
    前端面试攻略3------HTML和CSS部分
    前端面试攻略2------计算机网络部分
  • 原文地址:https://www.cnblogs.com/albertrui/p/8401160.html
Copyright © 2011-2022 走看看