原文: https://javatutorial.net/java-concurrenthashset-example

Java 8 最终允许我们(程序员)在 Java 中创建线程安全的ConcurrentHashSet。 在此之前,这根本是不可能的。 有一些变种试图简化上述类的实现,其中之一就是使用带有虚拟值ConcurrentHashMap 。 但是,您可能已经猜到,ConcurrentHashMap 的所有即兴创作都有其局限性和风险。

Java `ConcurrentHashSet`示例 - 图1

Java 8 允许我们使用keySet(defaultVal)newKeySet()方法来返回 Set,这恰好是一个合适的集合。 这样可以访问用户可以使用的许多必要功能:contains()remove()等。 注意: 这些方法在ConcurrentHashMap中可用,而不是在ConcurrentMap接口中可用, 意味着必须创建ConcurrentHashMap类型的变量,并将其用作引用。 另一种方法是对象的简单转换。

Java 并发 API 中包含许多Collection类,例如ArrayListCopyOnArrayListHashMapConcurrentHashMapHashSetCopyOnWriteArraySet。 但是,尽管有所有这些示例,但没有类似ConcurrentHashSet的东西。 许多开发人员说,他们可以使用具有相同值的ConcurrentHashMap来实现所需的集合,但是这种方法的问题在于,您拥有的是映射而不是集合。 因此,这将导致无法使用伪值对ConcurrentHashMap执行设置操作。 简而言之,它不是Set

还有其他尝试创建ConcurrentHashSet的即兴创作,但现在它们都已过去,因为 Java 8 添加了newKeySet(),它返回由ConcurrentHashMap支持的Set

如何在 Java 8 中创建ConcurrentHashSet

  1. ConcurrentHashMap<String, Integer> example = new ConcurrentHashMap<>();
  2. Set<String> exampleSet = example.newKeySet();
  3. exampleSet.add("example");
  4. exampleSet.add("example2");
  5. exampleSet.contains("example2");
  6. exampleSet.remove("example");

在上面的示例中,我们创建了集合,并向其中添加了 2 个元素,检查它是否包含某个元素并删除了某个元素。

注意: 这是在 Java 中创建线程安全Set的唯一方法。

Java 程序使用java.util.concurrent.ConcurrentHashMap类上添加的新方法创建ConcurrentHashSet

  1. import java.util.Set;
  2. import java.util.concurrent.ConcurrentHashMap;
  3. public class Example {
  4. public static void main(String[] args) throws Exception {
  5. ConcurrentHashMap shoesCost = new ConcurrentHashMap<>();
  6. shoesCost.put("Nike", 80);
  7. shoesCost.put("Adidas", 40);
  8. shoesCost.put("Reebok", 76);
  9. Set shoeCostSet = shoesCost.keySet();
  10. shoeCostSet = shoesCost.newKeySet();
  11. System.out.println("before adding element into concurrent set: " + shoeCostSet);
  12. shoeCostSet.add("Puma");
  13. System.out.println("after adding element into concurrent set: " + shoeCostSet);
  14. shoeCostSet.contains("Adidas");
  15. shoeCostSet.remove("Reebok");
  16. }
  17. }

输出

  1. before adding an element into the concurrent set: [Nike, Adidas, Reebok]
  2. after adding an element into the concurrent set: [Nike, Adidas, Reebok, Puma]