CopyOnWriteArraySet
这是班里的弟弟
CopyOnWriteArrayList
。这些是 JDK 1.5 中添加的一组专门的类以及它们更受欢迎的表亲
ConcurrentHashMap
。它们是包的一部分
concurrent collection framework
并位于包中
java.util.concurrent
。
CopyOnWriteArraySet
最适合只读集合,这些集合的大小足够小,可以在发生某些修改操作时进行复制。例如,您可以
CopyOnWriteArraySet
在应用程序启动时存储一个对象,并让多个其他线程在应用程序的整个生命周期中访问该对象。如果在此期间到达新的状态或对象,它也可能被添加到 this 中
Set
,但代价是创建一个新数组。要了解的最重要的事情之一
CopyOnWriteArraySet
是它是使用
CopyOnWriteArrayList
. 这意味着它
CopyOnWriteArraySet
也共享 的所有基本属性
CopyOnWriteArrayList
。另一件要记住的重要事情是该集合类的迭代器不支持
remove()
. 尝试在积分过程中删除元素将导致异常值
UnsupportedOperationException
。这样做是为了确保爬行期间的速度。使用迭代器遍历此实现
Set
相当快,并且避免了其他线程的干扰。为了进行操作,迭代器依赖于创建迭代器时拍摄的数组快照。简而言之,
CopyOnWriteArraySet
如果
set
足够小,可以在添加、设置或删除对象时进行复制,主要目的是读取零星更新的数据。另外,如果您想在迭代过程中删除元素,请不要使用此实现,因为它的迭代器不支持
remove()
, 和 throws
java.lang.UnsupportedOperationException
,如下所示:
[RAJ] Event received : FOUR
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
at Publisher.notifySubs(HelloHP.java:43)
at HelloHP.main(HelloHP.java:23)
Java 中的 CopyOnWriteArraySet 示例
这是一个现成的 Java 程序,展示了如何使用
CopyOnWriteArraySet
. 在我们的示例中,我们使用发布者
-订阅者模式来演示其用法。大多数订阅者是在应用程序启动期间订阅的,发布者的主要任务是枚举它们并通知它们任何更新。订阅者的添加和删除可能会不时发生。由于我们需要快速旁路,因此
CopyOnWriteArraySet
这是一个不错的选择,特别是在多线程环境中,其中一个线程可以添加订阅者,而另一个线程处理更新。
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;
public class CopyOnWriteArraySetDemo{
public static void main(String args[]) {
Publisher cricNext = new Publisher();
SubScriber raj = new SubScriber("RAJ");
SubScriber adom = new SubScriber("ADOM");
cricNext.addSubscriber(raj);
cricNext.addSubscriber(adom);
cricNext.notifySubs("FOUR");
cricNext.notifySubs("SIX");
}
}
class Publisher {
private CopyOnWriteArraySet setOfSubs = new CopyOnWriteArraySet();
public void addSubscriber(SubScriber sub) {
setOfSubs.add(sub);
}
public void notifySubs(String score) {
Iterator itr = setOfSubs.iterator();
while (itr.hasNext()) {
SubScriber sub = itr.next();
sub.receive(score);
}
}
}
class SubScriber {
private String _name;
public SubScriber(String name) {
this._name = name;
}
public void receive(String score) {
System.out.printf("[%s] Event received : %s %n", _name, score);
}
}
输出:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
要记住什么
CopyOnWriteArraySet
实现了
Collection
和接口
Set
,以及在 JDK 1.5 中添加的,以及
Set
'a,的另一个自定义实现
EnumSet
。它也是
Set
一种使用内部
CopyOnWriteArrayList
进行所有操作的工具。因此,它具有与此类相同的基本属性。由于不是
SortedSet
,因此在迭代过程中不能保证元素的顺序。
-
CopyOnWriteArraySet
最适合以下应用:
Set
的大小往往保持较小。
- 操作
read-only
明显优于修改对象的操作。
- 必须防止遍历期间线程之间的干扰
Set
。
- 另一个优点
CopyOnWriteArraySet
是线程安全。该集合支持并发。
- 突变操作(添加、修改、删除等)的成本很高,因为它们通常需要复制整个底层数组。
- 迭代器不支持变异删除操作。
- 使用迭代器的遍历速度非常快,并且排除了其他线程的干扰。为了进行操作,迭代器依赖于创建迭代器时拍摄的数组快照。
这就是
CopyOnWriteArraySet
Java 中的用法。正如我所说,他是弟弟
CopyOnWriteArrayList
。因此,如果您至少了解其中之一,则可以使用另一个。唯一的区别是一个是
List
'',另一个
Set
是 '',因此这需要继承 Java 中这些数据结构之间的所有差异。例如,
List
元素的顺序很重要并且可能包含重复项。虽然
Set
无序,但它不允许对象重复。永远记住,
CopyOnWriteArraySet
这是一门专业课
Collection
。仅应在条件有利时使用。在任何其他情况下,您都可以使用通用实现。例如,
HashSet
或
LinkedHashSet
同步集合类。原文:
如何在 Java 中使用 CopyOnWriteArraySet 并举例
GO TO FULL VERSION