拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java ConcurrentHashSet 等价于 ConcurrentHashMap

Java ConcurrentHashSet 等价于 ConcurrentHashMap

白鹭 - 2022-03-07 2336 0 2

一、概述

在本教程中看到的是与线程相关的HashSet情况,HashSet什么是安全的ConcurrentHashMap方法。此外,我们将研究中将提供的优势。

2. 使用ConcurrentHashMap工厂方法的安全问题HashSet

首先,将查看公开的newKeySet()方法ConcurrentHashMap原理,我们此方法返回使用一个java.util.Set接口的实例,并允许标准方法,如add(), contains(),等。

这可以简单地创建为:

Set<Integer> threadSafeUniqueNumbers = ConcurrentHashMap.newKeySet();
 threadSafeUniqueNumbers.add(23);
 threadSafeUniqueNumbers.add(45);

此外,Set类似的HashSet,因为两者都使用基于哈希算法。另外,因为带来了额外的结果的同步性,实现的同时实现ConcurrentHashMap

最后,是该改进的方法只是从 Java 8 开始存在

3. 使用ConcurrentHashMap实例方法的安全线程HashSet

至此,我们已经取得了成功,我们将了解ConcurrentHashMap.处理可用的实例方法来创建ConcurrentHashMap线程安全的Set实例newKeySet()newKeySet(defaultValue)

我们已经创建了一个与原始地图链接SetConcurrentHashMap, Set方法。

3.1newKeySet()方法

如题,有newKeySet()一个包含原始映射的所有键的主要区别在于我们Set newKeySet(defaultValue)当前方法不支持Set新元素。因此,如果我们尝试调用add()addAll(),将 UnsupportedOperationException

其他remove(object)clear()的操作按预期工作,但我们需要注意Set任何更改都将在原来的上图或中:

ConcurrentHashMap<Integer,String> numbersMap = new ConcurrentHashMap<>();
 Set<Integer> numbersSet = numbersMap.keySet();
 numbersMap.put(1, "One");
 numbersMap.put(2, "Two");
 numbersMap.put(3, "Three");
 System.out.println("Map before remove: "+ numbersMap);
 System.out.println("Set before remove: "+ numbersSet);
 numbersSet.remove(2);
 System.out.println("Set after remove: "+ numbersSet);
 System.out.println("Map after remove: "+ numbersMap);

是上面代码的输出:

Map before remove: {1=One, 2=Two, 3=Three}
 Set before remove: [1, 2, 3]
 Set after remove: [1, 3]
 Map after remove: {1=One, 3=Three}

3.2.newKeySet(defaultValue)方法

让查看另一个使用地图中的键Set与上面提到的我们相比,newKeySet(defaultValue)返回一个Set实例,该实例支持通过调用设置上的add()或一种addAll()

进一步查看作为附加的默认值的参数,这方法被显示在地图中添加了每个新项目的值add()或。下面的例子addAll()是它是如何的:

ConcurrentHashMap<Integer,String> numbersMap = new ConcurrentHashMap<>();
 Set<Integer> numbersSet = numbersMap.keySet("SET-ENTRY");
 numbersMap.put(1, "One");
 numbersMap.put(2, "Two");
 numbersMap.put(3, "Three");
 System.out.println("Map before add: "+ numbersMap);
 System.out.println("Set before add: "+ numbersSet);
 numbersSet.addAll(asList(4,5));
 System.out.println("Map after add: "+ numbersMap);
 System.out.println("Set after add: "+ numbersSet);

下面是代码的输出:

Map before add: {1=One, 2=Two, 3=Three}
 Set before add: [1, 2, 3]
 Map after add: {1=One, 2=Two, 3=Three, 4=SET-ENTRY, 5=SET-ENTRY}
 Set after add: [1, 2, 3, 4, 5]

4. 使用Collections实用程序类的安全线程HashSet

让我们使用方法可以来创建一个线程安全的java.util.Collections实例synchronizedSet()HashSet

Set<Integer> syncNumbers = Collections.synchronizedSet(new HashSet<>());
 syncNumbers.add(1);

在使用这种方法时,就需要意识到它的功效。与之前相比,我们只是简单地讨论了这些包装的同时ConcurrentHashMapsynchronizedSet()将它们的同时呈现在了Set中。

5. 使用CopyOnWriteArraySet安全Set

Set实现的最后一种方法CopyOnWriteArraySet。创建这个实现Set的实例很简单:

Set<Integer> copyOnArraySet = new CopyOnWriteArraySet<>();
 copyOnArraySet.add(1);

使用该类的东西看起来很复杂,但我们需要考虑CopyOnWriteArraySet一些Array,严重缺陷。使用由支持的设定时间,复杂度为 O(1)。HashMap,contains()remove()ConcurrentHashMap,

Set大小通常保持且仅能在大多数情况下使用实现。

6 落幕

在本文中,看到了创建线程安全Set实例的不同之处,并突出了它们之间的区别,我们首先看到了三种方法。当时,应该是ConcurrentHashMap.newKeySet()HashSetConcurrentHashMapConcurrentHashMapnewKeySet(), newKeySet(defaultValue)

最后我们还讨论了Collections. synchronizedSet()CopyOnWriteArraySet存在性能缺陷。


0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *