【问题标题】:Thread-safe HashSet with Guava Collections带有 Guava 集合的线程安全 HashSet
【发布时间】:2011-04-07 11:02:19
【问题描述】:

正如标题所说,我想使用 Guava Collections 获得一个线程安全的 HashSet。
有吗?

【问题讨论】:

  • 如果线程安全已经是不可变的,那么它就没有意义了,不是吗?
  • 你是威利。它不会是一成不变的。多个线程将同时对其进行变异。
  • 顺便说一句,不要仅仅因为它们来自 Guava 而喜欢来自 Guava 的集合而不是 JDK 的集合。当它们对你的工作最有意义时使用它们。
  • @Colin:完全同意,事实上,我的回答根本没有使用任何 Guava 类,只是 Java 并发框架附带的。 :-P
  • @CollinD:是的,这绝对是真的。但我很了解 java.util 和 java.concurrent 集合。我有一个正在运行的程序,正在尝试测试 Guava Collections。

标签: java collections hashset guava


【解决方案1】:
Set<K> set = Collections.newSetFromMap(new ConcurrentHashMap<K, Boolean>());

【讨论】:

  • 顺便说一句,当我在番石榴邮件列表上回答这个问题时,你的所有观点都属于我,在它发布到这里之前 8 分钟;)
  • @Willi:如果我可以将它们分配给您,我会的,因为我已经达到了当天的代表上限,所以我绝对没有得到这个答案的代表。 :-P
  • 你会认为有更直接的方法来做到这一点。
  • @Colin:欢迎使用 Java!如果您想要简单明了,请使用 Ruby 或 Scheme 编写代码。 :-P
  • @Colin:它可能看起来像一个怪物代码。但是,一旦您进入 API 并熟悉它,您就会惊讶于它的简单程度。 Streams 框架发生在我身上。
【解决方案2】:

这将是正确的答案,使用来自 Guava 的 Sets 类。无论如何,@crhis 的回答是好的。

Sets.newSetFromMap(new ConcurrentHashMap<V, Boolean>());

【讨论】:

  • 其实这个已经被弃用了,目前应该使用Collections.newSetFromMap(new ConcurrentHashMap&lt;V, Boolean&gt;());
【解决方案3】:

Java 8 引入了创建并发哈希集的新方法 - ConcurrentHashMap.newKeySet()

Set<K> set = ConcurrentHashMap.newKeySet();

它比包裹在Collections.newSetFromMap中更短

【讨论】:

    【解决方案4】:

    Google Collections有一段时间有一个名为 Sets.newConcurrentHashSet() 的工厂方法。

    它的实现类似于 Chris 的建议:

    public static <E> Set<E> newConcurrentHashSet() {
      return newSetFromMap(new ConcurrentHashMap<E, Boolean>());
    }
    

    他们在 com.google.common.collect.Sets 类中有一个 newSetFromMap() 方法(由 Doug Lea 在 JCP JSR-166 成员的协助下编写)。该方法已添加到 java 1.6 中的 java.util.Collections 中。

    它在 Google Collections 1.0rc1 中被撤回,因为计划在 Guava 中更好地支持并发集(更多信息here)。

    This post 扩展了使用“newSetFromMap”方法来构造并发集合。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    相关资源
    最近更新 更多