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