一、概述
在本教程中看到的是与线程相关的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)
我们已经创建了一个与原始地图链接Set
的ConcurrentHashMap,
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);
在使用这种方法时,就需要意识到它的功效。与之前相比,我们只是简单地讨论了这些包装的同时ConcurrentHashMap
,synchronizedSet()
将它们的同时呈现在了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()
HashSet
。ConcurrentHashMap
ConcurrentHashMap
newKeySet(), newKeySet(defaultValue)
最后我们还讨论了Collections.
synchronizedSet()
和CopyOnWriteArraySet
存在性能缺陷。
0 评论