为什么没有针对ConcurrentHashMap的ConcurrentHashSet
HashSet基于HashMap。
如果我们看一下HashSet<E>
实现,所有东西都在HashMap<E,Object>
下进行管理。
<E>
被用作HashMap
的关键字。
我们知道HashMap
不是线程安全的。 这就是为什么我们有Java中的ConcurrentHashMap
。
基于此,我很困惑, 为什么我们没有一个ConcurrentHashSet应该基于ConcurrentHashMap
?
还有什么我失踪? 我需要在多线程环境中使用Set
。
另外,如果我想创建自己的ConcurrentHashSet
,我可以通过将HashMap
替换为ConcurrentHashMap
并将剩下的部分保持原样来实现它?
ConcurrentHashSet
没有内置类型,因为您始终可以从地图派生一个集合。 由于地图类型很多,因此您可以使用一种方法从给定的地图(或地图类)生成一个集合。
在Java 8之前,您通过使用Collections.newSetFromMap(map)
生成由并发散列映射支持的并发散列集,
在Java 8中(由@Matt指出),你可以通过ConcurrentHashMap.newKeySet()
获得一个并发散列集合视图。 这比旧的newSetFromMap
要求你传入一个空的地图对象要简单一些。 但它特定于ConcurrentHashMap
。
无论如何,每当创建一个新的地图界面时,Java设计人员都可能创建了一个新的设置界面,但是当第三方创建他们自己的地图时,这种模式将无法执行。 拥有派生新集合的静态方法会更好; 即使您创建自己的地图实现,该方法也可以正常工作。
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
使用番石榴15,您也可以简单地使用:
Set s = Sets.newConcurrentHashSet();
链接地址: http://www.djcxy.com/p/67069.html
上一篇: Why there is no ConcurrentHashSet against ConcurrentHashMap