JavaRush /Java 博客 /Random-ZH /如何在 Java 中使用 CopyOnWriteArraySet 并举例(翻译)
Lam-lam
第 30 级

如何在 Java 中使用 CopyOnWriteArraySet 并举例(翻译)

已在 Random-ZH 群组中发布
CopyOnWriteArraySet这是班里的弟弟CopyOnWriteArrayList。这些是 JDK 1.5 中添加的一组专门的类以及它们更受欢迎的表亲ConcurrentHashMap。它们是包的一部分concurrent collection framework并位于包中java.util.concurrent如何在 Java 中使用 CopyOnWriteArraySet 示例(翻译)- 1CopyOnWriteArraySet最适合只读集合,这些集合的大小足够小,可以在发生某些修改操作时进行复制。例如,您可以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;

/**
 * Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,
 * CopyOnWriteArraySet doesn't support remove() operation.
 *
 * @author Javin Paul
 */
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);

            //itr.remove(); // not allowed, throws UnsupportedOperationException
        }
    }
}

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,因此在迭代过程中不能保证元素的顺序。 如何在 Java 中使用 CopyOnWriteArraySet 示例(翻译)- 2
  1. CopyOnWriteArraySet最适合以下应用:

    • Set的大小往往保持较小。
    • 操作read-only明显优于修改对象的操作。
    • 必须防止遍历期间线程之间的干扰Set
  2. 另一个优点CopyOnWriteArraySet是线程安全。该集合支持并发。
  3. 突变操作(添加、修改、删除等)的成本很高,因为它们通常需要复制整个底层数组。
  4. 迭代器不支持变异删除操作。
  5. 使用迭代器的遍历速度非常快,并且排除了其他线程的干扰。为了进行操作,迭代器依赖于创建迭代器时拍摄的数组快照。
这就是CopyOnWriteArraySetJava 中的用法。正如我所说,他是弟弟CopyOnWriteArrayList。因此,如果您至少了解其中之一,则可以使用另一个。唯一的区别是一个是List'',另一个Set是 '',因此这需要继承 Java 中这些数据结构之间的所有差异。例如,List元素的顺序很重要并且可能包含重复项。虽然Set无序,但它不允许对象重复。永远记住,CopyOnWriteArraySet这是一门专业课Collection。仅应在条件有利时使用。在任何其他情况下,您都可以使用通用实现。例如,HashSetLinkedHashSet同步集合类。原文:如何在 Java 中使用 CopyOnWriteArraySet 并举例
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION