线程安全的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<E> extends AbstractSet<E> implements Set<E>, Serializable{
private final Map<E, Boolean> m; // The backing map
private transient Set<E> s; // Its keySet
SetFromMap(Map<E, Boolean> map) {
if (!map.isEmpty()) throw new IllegalArgumentException("Map is non-empty");
m = map;
s = map.keySet();
}
// .... ...
}
码字不易,转载请保留原文连接https://www.jianshu.com/p/f25d9d7fdaf3