• java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍


    这一节我们来接着介绍JUC集合:CopyOnWriteArraySet和ConcurrentSkipListSet。从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOnWriteArrayList一样是动态数组实现;ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。下面我们深入细致的分析一下他们的用法。

    CopyOnWriteArraySet简介

    它是线程安全的无序的集合,可以将它理解成线程安全的HashSet。对其所有操作使用内部 CopyOnWriteArrayList 的 Set。因此,它共享以下相同的基本属性:

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

    我们看一下CopyOnWriteArraySet的类体:

    public class CopyOnWriteArraySet<E> extends AbstractSet<E> implements Serializable {
       private static final long serialVersionUID = 5457747651344034263L;
        private final CopyOnWriteArrayList<E> al = new CopyOnWriteArrayList();
    }

    该类有一个成员变量CopyOnWriteArrayList。CopyOnWriteArraySet其所有操作使用内部 CopyOnWriteArrayList 的 Set,所以他的所有的方法其实都是引用了CopyOnWriteArrayList的方法来完成的。有关CopyOnWriteArrayList的使用说明我们在上一节里已经介绍的很详细,有兴趣可以查看上一节里的源码介绍。

    ConcurrentSkipListSet简介

    ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。他是一个基于 ConcurrentSkipListMap 的可缩放并发 NavigableSet 实现。下面我们看一下方法体:

    public class ConcurrentSkipListSet<E>
            extends AbstractSet<E>
            implements NavigableSet<E>, Cloneable, java.io.Serializable {
    
       private static final long serialVersionUID = -2479143111061671589L;
    
        private final ConcurrentNavigableMap<E,Object> m;
    
        public ConcurrentSkipListSet() {
            m = new ConcurrentSkipListMap<E,Object>();
        }
    
    }

    (01) ConcurrentSkipListSet继承于AbstractSet。因此,它本质上是一个集合。

    (02) ConcurrentSkipListSet实现了NavigableSet接口。因此,ConcurrentSkipListSet是一个有序的集合。

    (03) ConcurrentSkipListSet是通过ConcurrentSkipListMap实现的。它包含一个ConcurrentNavigableMap对象m,而m对象实际上是ConcurrentNavigableMap的实现类ConcurrentSkipListMap的实例。ConcurrentSkipListMap中的元素是key-value键值对;而ConcurrentSkipListSet是集合,它只用到了ConcurrentSkipListMap中的key!

    由源码中我们能看到ConcurrentSkipListSet内部所有操作都是在内部由ConcurrentSkipListMap完成。本节我们先不介绍ConcurrentSkipListMap,下节讲到map的时候再细说。

  • 相关阅读:
    点击拖动,让物体旋转
    unity中让物体不能穿到另一个物体里面去
    XML一小节
    unity中摄像机的控制---调整摄像机,不让他摔倒
    Unity 制作游侠暂停
    unity使用 NGUI制作技能冷却效果的思路
    unity中设置贴图的透明
    C#中实现打开文件夹所在的位置
    Windows下的MongoDB的安装与配置
    Scrapy运行中常见网络相关错误
  • 原文地址:https://www.cnblogs.com/rickiyang/p/11074249.html
Copyright © 2020-2023  润新知