`

源码剖析之CopyOnWriteArraySet

阅读更多
CopyOnWriteArraySet :是基于CopyOnWriteArrayList 的实现。只是在添加之前先判断是否已经存储相关记录。

注意:此Set的实现和普通的HashSet 已经相差甚远了。HashSet 是基于HashMap的实现。 从实现的角度就能看出CopyOnWriteArraySet  的使用条件和list的血缘更近,使用的场景也更近!!


它最适合于具有以下特征的应用程序:
set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
它是线程安全的。
因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。
迭代器不支持可变 remove 操作。
使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。


public class CopyOnWriteArraySet<E> extends AbstractSet<E>
        implements java.io.Serializable {
    private static final long serialVersionUID = 5457747651344034263L;
    //底层是个基于复制的列表,所有CopyOnWriteArrayList 所具有的劣势和优势 他全部具备
    private final CopyOnWriteArrayList<E> al;

    /**
     * Creates an empty set.
     */
    public CopyOnWriteArraySet() {
        al = new CopyOnWriteArrayList<E>();
    }

    /**
     * Creates a set containing all of the elements of the specified
     * collection.
     *
     * @param c the collection of elements to initially contain
     * @throws NullPointerException if the specified collection is null
     */
    public CopyOnWriteArraySet(Collection<? extends E> c) {
        al = new CopyOnWriteArrayList<E>();
        //和list的不同之处
        al.addAllAbsent(c);
    }

    /*
    以下操作全部和CopyOnWriteArrayList的效果一样
    */
    public int size() {
	   return al.size();
    }

    
    public boolean isEmpty() {
	    return al.isEmpty();
    }

    public boolean contains(Object o) {
	return al.contains(o);
    }

   
    public Object[] toArray() {
	    return al.toArray();
    }

    /**底层数组的复制
    */
    public <T> T[] toArray(T[] a) {
      	return al.toArray(a);
    }

    public void clear() {
        al.clear();
    }

    public boolean remove(Object o) {
	    return al.remove(o);
    }

    
    public boolean add(E e) {
    	//和CopyOnWriteArrayList 的不同处
	    return al.addIfAbsent(e);
    }

    
    。。。。。。。。。

    /**
     * 和CopyOnWriteArrayList 一样的快照迭代
     */
    public Iterator<E> iterator() {
	   return al.iterator();
    }

  
}


更多 详细内容请参考 CopyOnWriteArrayList:
http://wangxinchun.iteye.com/blog/1872212 的实现。
0
1
分享到:
评论

相关推荐

    Java concurrency集合之CopyOnWriteArraySet_动力节点Java学院整理

    这使得CopyOnWriteArraySet在并发环境下的性能表现有其独特之处。 CopyOnWriteArraySet的数据结构与CopyOnWriteArrayList类似,都是基于动态数组。CopyOnWriteArraySet通过CopyOnWriteArrayList来存储元素,而...

    java集合-CopyOnWriteArraySet的使用

    CopyOnWriteArraySet 是Java中的一个线程安全的集合类,它实现了 Set 接口并使用了"写时复制"的机制。 下面是关于 CopyOnWriteArraySet 的一些重要信息: 线程安全性:CopyOnWriteArraySet 是线程安全的,可以在多...

    第四章 CopyOnWriteArraySet源码解析1

    在多线程环境下,CopyOnWriteArraySet能够在不干扰其他线程读取数据的情况下进行修改操作,从而避免了同步带来的性能影响。 1. **CopyOnWriteArraySet的创建** CopyOnWriteArraySet的构造函数很简单,它内部使用了...

    CopyOnWriteArrayListCopyOnWri

    《CopyOnWriteArrayList与CopyOnWriteArraySet源码解析》 CopyOnWriteArrayList与CopyOnWriteArraySet是Java集合框架中的两种线程安全的数据结构,它们在多线程环境下提供了高效且安全的操作。这两个类源自于`java....

    java并发编程源码

    `jcip-examples-src.jar`可能包含Java并发编程实战中的各种容器示例,如`BlockingQueue`(阻塞队列)用于线程间的通信,`CopyOnWriteArrayList`和`CopyOnWriteArraySet`提供线程安全的集合操作。 5. **jcip-...

    《Java Concurrency in Practice》源码

    10. **并发集合**:ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet等并发集合类在并发环境下提供了高效且线程安全的数据结构。源码分析有助于理解它们的实现机制和性能优势。 通过对《Java ...

    java concurrent 精简源码

    Java并发库还提供了一些线程安全的容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`CopyOnWriteArraySet`等,它们在并发环境下提供了高效且安全的数据存储和访问。 6. **原子类(Atomic)** 原子类如`...

    java7并发编程实战手册+源码

    本书涵盖了从基本概念到高级特性的全方位知识,是提升Java并发编程能力的不二之选。 在Java中,多线程是并发编程的基础,它允许程序同时执行多个任务,从而提高系统的利用率和性能。Java 7在并发方面引入了许多改进...

    java 7并发编程实战手册 源码

    这本书的源码打包提供了丰富的实例,可以帮助读者更好地理解并应用书中所讲解的概念。这里我们将详细解析其中涉及的重要知识点。 首先,Java并发编程的核心是线程,Java 7在多线程处理方面做了很多优化,如引入了...

    Java并发编程的艺术源码

    - `CopyOnWriteArrayList`和`CopyOnWriteArraySet`: 在迭代时提供不变性,适合于读多写少的场景。 - `BlockingQueue`: 阻塞队列,提供线程安全的队列操作,常用于生产者消费者模式。 5. **原子变量** - `...

    并发编程之一 日常学习笔记

    最后,"并发List、Set、ConcurrentHashMap底层原理剖析"(文件"03")将讨论Java中常用的并发容器,如CopyOnWriteArrayList、CopyOnWriteArraySet和ConcurrentHashMap。这些容器采用了不同的策略来保证线程安全,如...

    java高并发编程源码.zip

    - **CopyOnWriteArrayList/CopyOnWriteArraySet**:写时复制策略,读操作无锁,写操作复制整个数组,适合读多写少的场景。 5. **线程池**: - **ExecutorService**:Java并发框架的一部分,提供线程池服务,可以...

    java多线程设计模式详解(PDF及源码)

    - **CopyOnWriteArrayList/CopyOnWriteArraySet**:适用于读多写少的情况,读操作无需加锁,写操作则复制整个集合。 7. **源码分析** - PDF文档和源码结合可以帮助读者深入理解多线程设计模式的实际应用,通过...

    java并发编程实战源码,java并发编程实战pdf,Java源码.zip

    - **CopyOnWriteArrayList和CopyOnWriteArraySet**:在迭代时不会抛出`ConcurrentModificationException`,适用于读多写少的场景。 - **Atomic*类**:如AtomicInteger、AtomicLong等,提供原子操作的包装类。 5. ...

    openjdk 源码下载链接

    - **CopyOnWriteArrayList 和 CopyOnWriteArraySet**:这两种集合类在 OpenJDK 7 中得到了优化,减少了内存使用量。 2. **垃圾回收器**: - **Parallel GC**:并行垃圾回收器的性能得到了显著提升。 - **CMS...

    java二叉树算法源码-JavaCore:Java核心知识。集合框架、JVM机制、多线程与并发框架、网络协议、SSM框架、MySQL、分布式、

    CopyOnWriteArraySet 二、:radio::radio::radio:JVM(Java虚拟机) Java虚拟机 (第 06 篇) 深入理解:类文件结构 Java虚拟机 (第 08 篇) 深入理解:打破双亲委派模型 三、:locked_with_key:Java多线程与并发框架...

    JAVA 容器类应用

    `CopyOnWriteArrayList`和`CopyOnWriteArraySet`是线程安全的容器,适用于多线程环境,它们在读多写少的场景下表现优秀。 `Vector`类是早期的容器,与`ArrayList`类似,但它是线程安全的。然而,由于同步开销,通常...

Global site tag (gtag.js) - Google Analytics