CopyOnWriteArraySet
Bu sinfning ukasi
CopyOnWriteArrayList
. Bular JDK 1.5 da qo'shilgan maxsus sinflar to'plami va ularning ko'proq mashhur qarindoshi
ConcurrentHashMap
. Ular paketning bir qismi
concurrent collection framework
va paketda joylashgan
java.util.concurrent
.
CopyOnWriteArraySet
Ba'zi o'zgartirish operatsiyalari sodir bo'lganda nusxa ko'chirish uchun o'lchami etarlicha kichik bo'lgan faqat o'qish uchun mo'ljallangan to'plamlar uchun eng mos keladi. Misol uchun, ilova ishga tushganda ob'ektni saqlash uchun foydalanishingiz mumkin
CopyOnWriteArraySet
va ilovaning butun hayoti davomida bir nechta boshqa mavzular ushbu ob'ektga kirish huquqiga ega bo'lishingiz mumkin.
Set
Agar shu vaqt ichida yangi holat yoki ob'ekt kelsa, u yangi massiv yaratish evaziga unga qo'shilishi mumkin . Bilish kerak bo'lgan eng muhim narsalardan biri
CopyOnWriteArraySet
- bu yordamida amalga oshiriladi
CopyOnWriteArrayList
. Bu shuni anglatadiki, u
CopyOnWriteArraySet
ning barcha asosiy xususiyatlarini ham baham ko'radi
CopyOnWriteArrayList
. Esda tutish kerak bo'lgan yana bir muhim narsa shundaki, ushbu to'plam sinfining iteratorlari
remove()
. Integratsiya jarayonida elementni olib tashlashga urinish, chetga chiqishga olib keladi
UnsupportedOperationException
. Bu emaklash paytida tezlikni ta'minlash uchun amalga oshiriladi. Ushbu dasturni
Set
iterator yordamida o'tkazish juda tez va boshqa ish zarrachalarining aralashuvini oldini oladi. Ishlash uchun iteratorlar iterator yaratilganda olingan massivning oniy rasmiga tayanadi. Muxtasar qilib aytganda, ob'ektlarni qo'shish, sozlash yoki o'chirishda nusxa ko'chirish uchun etarlicha kichik
CopyOnWriteArraySet
bo'lsa foydalaning
set
va asosiy maqsad vaqti-vaqti bilan yangilanadigan ma'lumotlarni o'qishdir. Bundan tashqari, agar siz iteratsiya paytida elementlarni o'chirmoqchi bo'lsangiz, ushbu ilovadan foydalanmang, chunki uning iteratori qo'llab-quvvatlamaydi
remove()
va
java.lang.UnsupportedOperationException
quyida ko'rsatilganidek, otadi:
[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-dagi CopyOnWriteArraySet misoli
Bu erda qanday foydalanishni ko'rsatadigan tayyor Java dasturi
CopyOnWriteArraySet
. Bizning misolimizda biz undan foydalanishni ko'rsatish uchun publisher
-subscriber naqshidan foydalandik. Ko'pgina obunachilar ilovani ishga tushirish vaqtida obuna bo'lishadi va nashriyotning asosiy vazifasi ularni sanab o'tish va har qanday yangilanishlar haqida xabardor qilishdir. Vaqti-vaqti bilan obunachilar qo'shilishi va o'chirilishi mumkin. Bizga tez aylanib o'tish kerak bo'lganligi sababli,
CopyOnWriteArraySet
bu juda yaxshi tanlovdir, ayniqsa ko'p tarmoqli muhitda, bunda bitta ip obunachi qo'shishi mumkin, ikkinchisi esa yangilanishlarni boshqaradi.
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);
}
}
Chiqish:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Nimani eslash kerak
CopyOnWriteArraySet
Collection
va interfeyslarini
Set
, shuningdek, JDK 1.5 da qo'shilgan boshqa
Set
"a," ilovasi bilan birgalikda amalga oshiradi
EnumSet
. Bu, shuningdek, barcha operatsiyalari uchun
Set
ichki foydalanadi .
CopyOnWriteArrayList
Shunday qilib, u ushbu sinfning bir xil asosiy xususiyatlariga ega. U bo'lmagani uchun
SortedSet
iteratsiya paytida elementlarning tartibi kafolatlanmaydi.
-
CopyOnWriteArraySet
Quyidagi ilovalar uchun eng mos keladi:
- ning o'lchamlari
Set
kichik bo'lib qoladi.
- Operatsiyalar
read-only
ob'ektlarni o'zgartiradigan operatsiyalardan sezilarli darajada ustundir.
- O'tish paytida iplar orasidagi shovqinni oldini olishingiz kerak
Set
.
- Yana bir afzallik
CopyOnWriteArraySet
- ipning xavfsizligi. Ushbu to'plam parallellikni qo'llab-quvvatlaydi.
- Mutativ operatsiyalar (qo'shish, o'zgartirish, o'chirish va boshqalar) qimmat, chunki ular odatda butun asosiy massivni nusxalashni talab qiladi.
- Iteratorlar mutatsiyali o'chirish operatsiyasini qo'llab-quvvatlamaydi.
- Iterator yordamida o'tish juda tez amalga oshiriladi va uning davomida boshqa iplarning aralashuvi istisno qilinadi. Ishlash uchun iteratorlar iterator yaratilganda olingan massivning oniy rasmiga tayanadi.
Bu
CopyOnWriteArraySet
Java-da foydalanish haqida. Aytganimdek, u kenja ukasi
CopyOnWriteArrayList
. Shunday qilib, agar siz ulardan kamida bittasini tushunsangiz, ikkinchisidan foydalanishingiz mumkin. Yagona farq shundaki, biri
List
"'", ikkinchisi
Set
esa "', shuning uchun bu Java-da ushbu ma'lumotlar tuzilmalari o'rtasidagi barcha farqlarni meros qilib olishni talab qiladi. Misol uchun,
List
elementlarning tartibi muhim va dublikatlarni o'z ichiga olishi mumkin. Tartibsiz bo'lsa-da
Set
, u ob'ektlarning takrorlanishiga yo'l qo'ymaydi.
CopyOnWriteArraySet
Bu ixtisoslashtirilgan sinf ekanligini doimo unutmang
Collection
. U faqat qulay sharoitlar mavjud bo'lganda foydalanish kerak. Boshqa har qanday holatda, siz umumiy maqsadli dasturlardan foydalanishingiz mumkin. Masalan,
HashSet
,
LinkedHashSet
yoki sinxronlashtirilgan yig'ish sinflari. Asl:
Misol bilan Java-da CopyOnWriteArraySet-dan qanday foydalanish kerak
GO TO FULL VERSION