Java ConcurrentHashSet示例

时间:2020-02-23 14:37:06  来源:igfitidea点击:

Java8最终允许我们程序员用Java创建线程安全的ConcurrentHashSet。在那之前,这根本不可能。有一些变体试图即兴实现上述类,其中之一就是使用带有伪值的ConcurrentHashMap。然而,正如我们可能已经猜到的,ConcurrentHashMap的所有即兴创作都有其局限性和风险。

Java8允许我们使用keySet(defaultVal)和newKeySet()方法返回集合,这恰好是一个正确的集合。这允许用户访问许多必需的函数:contains()、remove()等。* 注意:*这些方法在ConcurrentHashMap中可用,而不是在ConcurrentMap接口中,这意味着必须创建一个ConcurrentHashMap类型的变量,并将其用作引用。另一种方法是对对象进行简单的投射。

Java并发API中包含许多集合类,如用于ArrayList的CopyOnArrayList、用于HashMap的ConcurrentHashMap以及用于HashSet的CopyOnWriteArraySet。然而,尽管有这些例子,没有什么能像ConcurrentHashSet那样。许多开发人员说,他们可以使用具有相同值的ConcurrentHashMap来实现他们想要的集合,但是这种方法的问题是,我们拥有的不是集合,而是一个映射。这将导致无法在ConcurrentHashMap上使用伪值执行set操作。简单地说,这不是一套。

还有其他一些即兴创作尝试创建ConcurrentHashSet,但现在都已经过去了,因为Java8添加了newKeySet(),它返回一个由ConcurrentHashMap支持的集合。

如何在Java 8中创建ConcurrentHashSet

ConcurrentHashMap<String, Integer> example = new ConcurrentHashMap<>(); 
Set<String> exampleSet = example.newKeySet(); 
exampleSet.add("example"); 
exampleSet.add("example2");
exampleSet.contains("example2"); 
exampleSet.remove("example");

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

  • 说明:*这是在Java中创建线程安全集的唯一方法。

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

import java.util.Set; 
import java.util.concurrent.ConcurrentHashMap; 

public class Example { 
 public static void main(String[] args) throws Exception { 
    ConcurrentHashMap shoesCost = new ConcurrentHashMap<>(); 
    shoesCost.put("Nike", 80); 
    shoesCost.put("Adidas", 40); 
    shoesCost.put("Reebok", 76); 

    Set shoeCostSet = shoesCost.keySet(); 

    shoeCostSet = shoesCost.newKeySet(); 
    System.out.println("before adding element into concurrent set: " + shoeCostSet);
    shoeCostSet.add("Puma"); 
    System.out.println("after adding element into concurrent set: " + shoeCostSet); 
    shoeCostSet.contains("Adidas"); 
    shoeCostSet.remove("Reebok"); 
} 
}

输出

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