CopyOnWriteArraySet
Bu sinifin kiçik qardaşıdır
CopyOnWriteArrayList
. Bunlar daha populyar əmisi oğlu ilə birlikdə JDK 1.5-ə əlavə edilmiş ixtisaslaşdırılmış siniflər dəstidir
ConcurrentHashMap
. Onlar paketin bir hissəsidir
concurrent collection framework
və paketdə yerləşirlər
java.util.concurrent
.
CopyOnWriteArraySet
Bəzi dəyişdirmə əməliyyatları baş verərsə, kopyalanacaq ölçüdə kifayət qədər kiçik olan yalnız oxunaqlı kolleksiyalar üçün ən uyğundur. Məsələn, siz
CopyOnWriteArraySet
proqram başlayanda obyekti saxlamaq üçün istifadə edə və tətbiqin həyat dövrü ərzində bir çox digər mövzuların həmin obyektə daxil olmasına icazə verə bilərsiniz.
Set
Bu müddət ərzində yeni vəziyyət və ya obyekt gəlirsə, o , yeni massiv yaratmaq bahasına bu birinə əlavə edilə bilər . Bilmək lazım olan ən vacib şeylərdən biri
CopyOnWriteArraySet
də onun istifadə edərək həyata keçirilməsidir
CopyOnWriteArrayList
. Bu o deməkdir ki, o
CopyOnWriteArraySet
, həm də -nin bütün əsas xüsusiyyətlərini paylaşır
CopyOnWriteArrayList
. Xatırlamaq lazım olan başqa bir vacib şey odur ki, bu kolleksiya sinfinin iteratorları
remove()
. İnteqrasiya zamanı elementi silmək cəhdi kənar göstərici ilə nəticələnəcək
UnsupportedOperationException
. Bu, tarama zamanı sürəti təmin etmək üçün edilir. Bir iteratordan istifadə edərək bu tətbiqi keçmək
Set
kifayət qədər sürətlidir və digər mövzulardan müdaxilənin qarşısını alır. İşləmək üçün iteratorlar iterator yaradılan zaman çəkilmiş massivin snapshotına etibar edirlər. Bir sözlə, obyektləri əlavə edərkən, quraşdırarkən və ya silərkən kopyalamaq üçün kifayət qədər kiçik
CopyOnWriteArraySet
olduqda istifadə edin
set
və əsas məqsəd arabir yenilənən məlumatları oxumaqdır. Həmçinin, iterasiya zamanı elementləri silmək istəyirsinizsə, bu tətbiqdən istifadə etməyin, çünki onun iteratoru dəstəkləmir
remove()
və
java.lang.UnsupportedOperationException
aşağıda göstərildiyi kimi atır:
[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-da CopyOnWriteArraySet nümunəsi
Budur, necə istifadə olunacağını göstərən hazır Java proqramı
CopyOnWriteArraySet
. Nümunəmizdə onun istifadəsini nümayiş etdirmək üçün publisher
-subscriber modelindən istifadə etdik. Abunəçilərin əksəriyyəti tətbiqin işə salınması zamanı abunə olur və naşirin əsas vəzifəsi onları sadalamaq və hər hansı yeniliklər barədə xəbərdar etməkdir. Abunəçilərin əlavə və silinmələri vaxtaşırı baş verə bilər. Sürətli yan keçidə ehtiyacımız olduğundan,
CopyOnWriteArraySet
bu, xüsusilə bir ipin abunəçi əlavə edə bildiyi, digər mövzunun isə yeniləmələri idarə edə bildiyi çox yivli mühitdə yaxşı seçimdir.
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);
}
}
Çıxış:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Nə xatırlamaq lazımdır
CopyOnWriteArraySet
Collection
və interfeyslərini
Set
, eləcə də JDK 1.5-də əlavə edilmiş başqa bir
Set
'a,
EnumSet
. Həm də bütün əməliyyatları üçün
Set
daxili istifadə edən biridir .
CopyOnWriteArrayList
Beləliklə, bu sinfin eyni əsas xüsusiyyətlərini paylaşır. Olmadığına görə
SortedSet
, iterasiya zamanı elementlərin sırasına zəmanət verilmir.
-
CopyOnWriteArraySet
Tətbiqlər üçün ən uyğundur:
Set
'ların ölçüləri kiçik qalmağa meyllidir.
- Əməliyyatlar
read-only
obyektləri dəyişdirən əməliyyatlardan əhəmiyyətli dərəcədə üstündür.
- Kəsmə zamanı iplər arasında müdaxilənin qarşısını almalısınız
Set
.
- Digər bir üstünlük
CopyOnWriteArraySet
iplik təhlükəsizliyidir. Bu kolleksiya paralelliyi dəstəkləyir.
- Mutativ əməliyyatlar (əlavə etmək, dəyişdirmək, silmək və s.) baha başa gəlir, çünki onlar adətən bütün əsas massivin surətini çıxarmağı tələb edir.
- İteratorlar mutativ silmə əməliyyatını dəstəkləmir.
- Bir iteratordan istifadə edərək keçid olduqca sürətlidir və bu zaman digər iplərin müdaxiləsi istisna olunur. İşləmək üçün iteratorlar iterator yaradılan zaman çəkilmiş massivin snapshotına etibar edirlər.
Bütün bunlar
CopyOnWriteArraySet
Java-da istifadəyə aiddir. Dediyim kimi o, kiçik qardaşdır
CopyOnWriteArrayList
. Beləliklə, onlardan ən azı birini başa düşsəniz, digərindən istifadə edə bilərsiniz. Yeganə fərq, birinin
List
'', digərinin isə
Set
'' olmasıdır, buna görə də bu, Java-da bu məlumat strukturları arasındakı bütün fərqlərin miras alınmasını tələb edir. Məsələn,
List
elementlərin sırası vacibdir və dublikatları ehtiva edə bilər. Sıralanmamış halda
Set
, obyektlərin təkrarlanmasına icazə vermir.
CopyOnWriteArraySet
Həmişə bunun xüsusi bir sinif olduğunu unutmayın
Collection
. Yalnız əlverişli şərtlər olduqda istifadə edilməlidir. Hər hansı digər halda, ümumi təyinatlı tətbiqlərdən istifadə edə bilərsiniz. Məsələn,
HashSet
,
LinkedHashSet
və ya sinxronlaşdırılmış kolleksiya sinifləri. Orijinal:
Nümunə ilə Java-da CopyOnWriteArraySet-dən necə istifadə etmək olar
GO TO FULL VERSION