HashSet基于HashMap。
如果我们查看HashSet<E>实现,所有内容都在HashMap<E,Object>下管理。
<E>用作HashMap的键。
我们知道HashMap不是线程安全的。这就是为什么我们在Java中有ConcurrentHashMap。
基于此,我很困惑,为什么我们没有一个应该基于ConcurrentHashMap的ConcurrentHashSet ?
我还遗漏了什么吗?我需要在多线程环境中使用Set。
此外,如果我想创建自己的ConcurrentHashSet,我可以通过将HashMap替换为ConcurrentHashMap并保留其余部分来实现它吗?
如上所述,获得可并发HashSet的最佳方法是使用Collections.synchronizedSet()
Set s = Collections.synchronizedSet(new HashSet(...));
这对我来说很管用,我还没看到有人真正指出这一点。
正如Eugene指出的那样,这比目前批准的解决方案效率更低,因为它只是将您的集包装到同步装饰器中,而ConcurrentHashMap实际上实现了低级并发,它可以很好地支持您的集。所以,感谢斯捷潘年科夫先生阐明了这一点。
http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSet-java.util.Set-
如上所述,获得可并发HashSet的最佳方法是使用Collections.synchronizedSet()
Set s = Collections.synchronizedSet(new HashSet(...));
这对我来说很管用,我还没看到有人真正指出这一点。
正如Eugene指出的那样,这比目前批准的解决方案效率更低,因为它只是将您的集包装到同步装饰器中,而ConcurrentHashMap实际上实现了低级并发,它可以很好地支持您的集。所以,感谢斯捷潘年科夫先生阐明了这一点。
http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#synchronizedSet-java.util.Set-