并发十五:并发容器SetFromMap实现分析

线程安全的Set

J.U.C中实现Set接口的并发容器有CopyOnWriteArraySet和ConcurrentSkipListSet。
可以通过Collections.synchronizedSet(Set)构造一个线程安全的Set,同样使用synchronized进行串行化,吞吐量不高。
可以通过Collections.newSetFromMap(ConcurrentHashMap)来构建,使用ConcurrentHashMap保证并发性,因此性能较高。

CopyOnWriteArraySet

内部维护一个CopyOnWriteArrayList实例,所有的方法都是委托给这个实例实现,添加方法调用的是addIfAbsent以保证无重复数据。

ConcurrentSkipListSet

内部维护一个ConcurrentSkipListMap实例,所有的方法都是委托给这个实例实现。

添加操作:

public boolean add(E e) {
    return m.putIfAbsent(e, Boolean.TRUE) == null;
}

调用putIfAbsent保证元素不重复,键为元素e,值为Boolean.TRUE。

SetFromMap

Collections的内部类,使用包装的Map.keySet()作为容器

private static class SetFromMap extends AbstractSet implements Set, Serializable{
 
    private final Map m;  // The backing map
    private transient Set s;       // Its keySet
    
    SetFromMap(Map map) {
        if (!map.isEmpty()) throw new IllegalArgumentException("Map is non-empty");
        m = map;
        s = map.keySet();
    }
    // ....  ...
}

码字不易,转载请保留原文连接https://www.jianshu.com/p/f25d9d7fdaf3

你可能感兴趣的:(并发十五:并发容器SetFromMap实现分析)