JavaRush /Java Blog /Random-TW /如何在 Java 中使用 CopyOnWriteArraySet 並舉例(翻譯)
Lam-lam
等級 30

如何在 Java 中使用 CopyOnWriteArraySet 並舉例(翻譯)

在 Random-TW 群組發布
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