小编典典

为什么没有针对 ConcurrentHashMap 的 ConcurrentHashSet

all

HashSet 基于 HashMap。

如果我们看一下HashSet<E>实现,一切都在HashMap<E,Object>.

<E>用作 的键HashMap

我们知道这HashMap不是线程安全的。这就是我们ConcurrentHashMap在 Java 中使用的原因。

基于此,我很困惑 为什么我们没有应该基于的 ConcurrentHashSetConcurrentHashMap

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

另外,如果我想创建自己的ConcurrentHashSet,我可以通过替换HashMaptoConcurrentHashMap并将其余部分保持原样来实现它吗?


阅读 125

收藏
2022-03-04

共1个答案

小编典典

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

在 Java 8
之前,您可以生成由并发哈希映射支持的并发哈希集,方法是使用Collections.newSetFromMap(map)

在 Java 8(@Matt 指出)中,您 可以
通过ConcurrentHashMap.newKeySet().
这比旧newSetFromMap的要求您传入一个空的地图对象要简单一些。但它是特定于ConcurrentHashMap.

无论如何,Java
设计者可以在每次创建新的地图界面时创建一个新的集合界面,但是当第三方创建他们自己的地图时,这种模式将无法实施。最好有派生新集合的静态方法;即使您创建自己的地图实现,这种方法也始终有效。

2022-03-04