一、概述
在本教程中看到的是与线程相关的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。ConcurrentHashMapConcurrentHashMapnewKeySet(), newKeySet(defaultValue)
最后我们还讨论了Collections. synchronizedSet()和CopyOnWriteArraySet存在性能缺陷。
0 评论