`
zhuhui_zj
  • 浏览: 36630 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

并发容器分析(一)--CopyOnWriteArrayList

阅读更多

一、简介

    JDK5中添加了新的concurrent包,其中包含了很多并发容器,这些容器针对多线程环境进行了优化,大大提高了容器类在并发环境下的执行效率。

    CopyOnWriteArrayList类是一个线程安全的List接口的实现,在该类的内部进行元素的写操作时,底层的数组将被完整的复制,这对于读操作远远多于写操作的应用非常适合。在CopyOnWriteArrayList上进行操作时,读操作不需要加锁,而写操作类实现中对其进行了加锁。

二、具体实现

    CopyOnWriteArrayList底层的定义如下:

public class CopyOnWriteArrayList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {

    private volatile transient E[] array;

    private E[] array() { return array; }

    // 该操作是加锁的,防止array在copy的时候被替换 
    private synchronized void copyIn(E[] toCopyIn, int first, int n) {
        array  = (E[]) new Object[n];
        System.arraycopy(toCopyIn, first, array, 0, n);
    }

  ...
}

    读写操作:

public class CopyOnWriteArrayList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {

    public E get(int index) {
     // 由于包括rangeCheck和index两个操作,并不是直接在array上执行
   // 而是使用本地变量elementData引用array数组,防止两个操作之间
   // array被替换
     E[] elementData = array();
        rangeCheck(index, elementData.length);
        return elementData[index];
    }
    
    public synchronized E set(int index, E element) { // 是同步的
        int len = array.length;
        rangeCheck(index, len);
        E oldValue = array[index];

        // 判断该写的元素与原数据是否相同
        boolean same = (oldValue == element ||
        (element != null && element.equals(oldValue)));
        
        if (!same) {
            // [1] 创建一个新数组,将原array的值拷贝至新数组
        E[] newArray = (E[]) new Object[len];
            System.arraycopy(array, 0, newArray, 0, len);
            // [2] set的元素
        newArray[index] = element;
            // [3] 替换底层array数组
        array = newArray;
        }
        return oldValue;
    }

  ...
}

    add和remove也采用相同的技术:

public class CopyOnWriteArrayList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {

    public synchronized boolean add(E element) {
        // [1] new and copy
        int len = array.length;
        E[] newArray = (E[]) new Object[len+1];
        System.arraycopy(array, 0, newArray, 0, len);
        // [2] add element
        newArray[len] = element;
        // [3] change base array
        array = newArray;
        return true;
    }

    public synchronized E remove(int index) {
        int len = array.length;
        rangeCheck(index, len);
        E oldValue = array[index];
        // new一个新的数组
      E[] newArray = (E[]) new Object[len-1];
        // copy index之前的元素
      System.arraycopy(array, 0, newArray, 0, index);
        // copy余下的元素
      int numMoved = len - index - 1;
        if (numMoved > 0)
            System.arraycopy(array, index+1, newArray, index, numMoved);
        // 替换array引用    
     array = newArray;
        return oldValue;
    }

  ...
}

   特别注意:在CopyOnWriteArrayList上获得的Iterator是不能进行set和remove操作的,否则会抛出异常。

 

分享到:
评论

相关推荐

    java并发容器CopyOnWriteArrayList实现原理及源码分析

    Java并发容器CopyOnWriteArrayList实现原理及源码分析 Java并发容器CopyOnWriteArrayList是Java并发包中提供的一个并发容器,实现了线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现。...

    基于CopyOnWriteArrayList并发容器(实例讲解)

    CopyOnWriteArrayList是一种基于Copy-On-Write机制的并发容器,自JDK 1.5开始提供。它的基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后...

    并发容器的原理,7大并发容器详解、及使用场景

    并发容器的出现解决了传统同步容器在性能上的不足,通过引入更先进的并发控制策略,如锁分段、CAS算法等,提升了程序的并发性和吞吐量。 首先,我们要理解什么是同步容器。Java 集合框架中的非线程安全容器,如 ...

    Java从同步容器到并发容器的操作过程

    Java中的同步容器与并发容器是处理多线程环境下数据安全的重要工具。同步容器,如`Vector`和`HashTable`,通过在每个方法上添加`synchronized`关键字实现了线程安全,但这种方式存在性能瓶颈,因为每次操作都需要...

    09、并发容器(Map、List、Set)实战及其原理

    本课程"09、并发容器(Map、List、Set)实战及其原理"深入探讨了如何在多线程环境下有效使用Map、List和Set这三种核心数据结构。下面我们将详细讲解这些并发容器的关键知识点。 1. **并发容器概述**: 在并发编程...

    wuhaocn#guide-doc#并发容器之CopyOnWriteArrayList1

    1. CopyOnWriteArrayList的简介 2. COW的设计思想 3. CopyOnWriteArrayList的实现原理 4. 总结 2.读线程间

    Java并发编程与高并发解决方案笔记-基础篇.docx

    - **并发容器**:如ConcurrentHashMap、CopyOnWriteArrayList等,它们内部实现了线程安全,减少锁的使用。 - **非阻塞并发**:使用CAS(Compare and Swap)等无锁算法,减少线程间的竞争。 - **异步编程**:使用...

    【2018最新最详细】并发多线程教程

    16.并发容器之CopyOnWriteArrayList 17.并发容器之ThreadLocal 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题 19.并发容器之BlockingQueue 20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理...

    JAVA并发容器代码随读1

    在`java.util.concurrent`包中,有四种主要的并发容器类型:队列(BlockingQueue)、Map(ConcurrentMap)、Set(ConcurrentSkipListSet和CopyOnWriteArraySet)以及List(CopyOnWriteArrayList)。这些容器的设计...

    Java高并发经典文档-MOBI-可在电子书里查看

    2. **并发容器** - **并发集合**:包括线程安全的`Vector`、`Collections.synchronizedXXX`方法转换的同步集合,以及更高效的`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发集合。 - **阻塞队列**:如`...

    并发编程课程代码-01.zip

    8. **并发容器**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,这些容器在设计时就考虑到了多线程环境下的性能和安全性。 通过分析这个压缩包中的代码,我们可以深入理解这些并发编程概念,并学习如何在实际...

    实战Java高并发程序设计第二版随书代码

    - **线程安全的集合类**:如Vector、HashTable、Collections.synchronizedXXX() 方法产生的同步容器,以及CopyOnWriteArrayList 和 CopyOnWriteArraySet 等并发容器。 - **ConcurrentHashMap**:Java并发编程的...

    计算机后端-Java-Java高并发从入门到面试教程-课程准备.zip

    - **线程安全容器**:如Vector、Collections.synchronizedXXX()方法创建的容器,以及ConcurrentHashMap、CopyOnWriteArrayList等高效并发容器的使用。 - **并发队列**:如ArrayBlockingQueue、LinkedBlockingQueue...

    ( Java并发程序设计教程.zip )高清版 PDF

    它包含一系列优化过的线程安全容器,如ConcurrentHashMap、CopyOnWriteArrayList等,这些容器提供了高效且线程安全的并发操作。了解它们的工作原理和使用场景对于编写高性能并发程序至关重要。 书中的高级话题可能...

    Java 常见并发容器总结

    Java 常见并发容器总结 JDK 提供的这些容器大部分在 `java.util.concurrent` 包中。 - **`ConcurrentHashMap`** : 线程安全的 `HashMap` - **`CopyOnWriteArrayList`** : 线程安全的 `List`,在读多写少的场合性能...

    9、并发容器(Map、List、Set)实战及其原理.pdf

    本文介绍了几种常见的并发容器:`CopyOnWriteArrayList`、`CopyOnWriteArraySet`、`ConcurrentHashMap`和`ConcurrentSkipListMap`。这些容器的设计考虑到了Java多线程环境下的性能问题,通过不同的技术手段实现了...

    Java同步容器和并发容器详解

    Java同步容器和并发容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发。下面我们来一起学习Java同步容器和并发容器的知识点。 一、同步容器 同步容器在Java中主要包括...

    计算机后端-Java-Java高并发从入门到面试教程-发课程资料.zip

    3. **并发容器** - **并发集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,了解它们的设计原理和使用场景。 - **阻塞队列BlockingQueue**:如ArrayBlockingQueue、LinkedBlockingQueue等,理解其在生产者-...

    JAVA并发编程实践-构建执行程序块-学习笔记

    例如,ConcurrentHashMap、CopyOnWriteArrayList等都是并发容器。这些容器在多线程环境下可以确保线程安全。 阻塞队列是指在多线程环境下,使用队列来实现线程之间的通信的机制。例如,ArrayBlockingQueue、...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    3. **并发容器**:书中详细讨论了`java.util.concurrent`包下的并发容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`BlockingQueue`等。这些容器设计为线程安全,可以提高多线程环境下的性能。 4. **并发...

Global site tag (gtag.js) - Google Analytics