Concurrent Set的创建

从Java源代码的角度来说,HashSet是基于HashMap来实现的。其实细看下你会发现,除了EnumSet,其他几乎所有的XXXSet都是基于XXXMap来实现1。如:

  • HashSet(HashMap)
  • TreeSet(TreeMap)
  • LinkedHashSet(LinkedHashMap)
  • CopyOnWriteArraySet(CopyOnWriteArrayMap)
  • ConcurrentSkipListSet(ConcurrentSkipListMap)
  • JobStateReasons(HashMap)

但是有没有发现,好像并没有存在ConcurrentHashMap对应的ConcurrentHashSet

那我们自己该如何来实现呢?

  • CopyOnWriteArraySet

使用:

CopyOnWriteArraySet<E> sets = new CopyOnWriteArraySet<E>();

注意事项:最好适用于size比较小,并且绝大部分都是读操作。因为此种Set在写操作的时候很费时费力,需要完全拷贝原来的值。

  • ConcurrentSkipListSet

构造函数:

ConcurrentSkipListSet()
ConcurrentSkipListSet(Collection<? extends E> c)
ConcurrentSkipListSet(Comparator<? super E> comparator)
ConcurrentSkipListSet(SortedSet<E> s)
  • Collections.synchronizedSet(Set<T> s)

注意事项:生成的Set都是全局锁。相比于ConcurrentHashMap的分段锁来说效率比较低。

  • Collections.newSetFromMap(Map<E,Boolean> map)

JDK1.8之后的版本为我们提供了新的方法23

  • ConcurrentHashMap.newKeySey()

完全基于ConcurrentHashMap来实现的Concurrent Set。

  • Guava15 Sets.newConcurrentHashSet()

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值