一、前言

  分析完了CopyOnWriteArraySet后,继续分析Set集合在JUC框架下的另一个集合,ConcurrentSkipListSet,ConcurrentSkipListSet一个基于 ConcurrentSkipListMap 的可缩放并发 NavigableSet 实现。set 的元素可以根据它们的自然顺序进行排序,也可以根据创建 set 时所提供的 Comparator 进行排序,具体取决于使用的构造方法。

二、ConcurrentSkipListSet的数据结构

  由于ConcurrentSkipListSet是基于ConcurrentSkipListMap的实现,所以,其底层数据结构与ConcurrentSkipListMap的相同,具体可以参考ConcurrentSkipListMap,其数据结构如下。

  【JUC】JDK1.8源码分析之ConcurrentSkipListSet(八)

  说明:ConcurrentSkipListSet将所有键(key)所对应的值(value)均为Boolean.TRUE,所以数据结构与ConcurrentSkipListMap完全相同,并且对ConcurrentSkipListSet的操作都会转化为对ConcurrentSkipListMap的操作。

三、ConcurrentSkipListSet源码分析

  3.1 类的继承关系  

public class ConcurrentSkipListSet<E>
    extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable {}

  说明:ConcurrentSkipListSet继承了AbstractSet抽象类,AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作;同时实现了NavigableSet接口,NavigableSet具有了为给定搜索目标报告最接近匹配项的导航方法;同时实现了额Serializable接口,表示可以被序列化。

  3.2 类的属性  

public class ConcurrentSkipListSet<E>
    extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable {
    // 版本序列号
    private static final long serialVersionUID = -2479143111061671589L;
    // 对ConcurrentSkipListSet提供支持
    private final ConcurrentNavigableMap<E,Object> m;
    // 反射机制
    private static final sun.misc.Unsafe UNSAFE;
    // m字段的内存偏移量
    private static final long mapOffset;
    static {
        try {
            UNSAFE = sun.misc.Unsafe.getUnsafe();
            Class<?> k = ConcurrentSkipListSet.class;
            mapOffset = UNSAFE.objectFieldOffset
                (k.getDeclaredField("m"));
        } catch (Exception e) {
            throw new Error(e);
        }
    }
}
View Code

相关文章: