为什么没有针对 ConcurrentHashMap 的 ConcurrentHashSet

HashSet基于HashMap。

如果我们看一下实现,一切都在 下进行管理。HashSet<E>HashMap<E,Object>

<E>用作 的键。HashMap

我们知道这不是线程安全的。这就是为什么我们在Java中。HashMapConcurrentHashMap

基于此,我感到困惑的是,为什么我们没有一个应该基于 ConcurrentHashMap 的 ConcurrentHashSet

我还有什么想念的吗?我需要在多线程环境中使用。Set

另外,如果我想创建自己的,我可以通过替换to并保持其余部分不变来实现它吗?ConcurrentHashSetHashMapConcurrentHashMap


答案 1

没有内置类型,因为您始终可以从地图派生一个集合。由于有许多类型的映射,因此可以使用一种方法从给定的映射(或映射类)生成集合。ConcurrentHashSet

在 Java 8 之前,通过使用 Collections.newSetFromMap(map) 生成由并发哈希映射支持的并发哈希集

在Java 8(由@Matt指出)中,您可以通过ConcurrentHashMap.newKeySet()获得并发哈希集视图。这比旧的更简单一些,旧版本要求您传入一个空的map对象。但它特定于 .newSetFromMapConcurrentHashMap

无论如何,Java设计人员可以在每次创建新的映射接口时创建一个新的集合接口,但是当第三方创建自己的映射时,这种模式是不可能强制执行的。最好有派生新集的静态方法;这种方法始终有效,即使您创建自己的地图实现也是如此。


答案 2
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());