JavaRush /Java blogi /Random-UZ /Misol bilan Java-da CopyOnWriteArraySet-dan qanday foydal...
Lam-lam
Daraja

Misol bilan Java-da CopyOnWriteArraySet-dan qanday foydalanish kerak (tarjima)

Guruhda nashr etilgan
CopyOnWriteArraySetBu 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 frameworkva paketda joylashgan java.util.concurrent. Misol (tarjima) bilan Java-da CopyOnWriteArraySet-dan qanday foydalanish - 1CopyOnWriteArraySetBa'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 CopyOnWriteArraySetva ilovaning butun hayoti davomida bir nechta boshqa mavzular ushbu ob'ektga kirish huquqiga ega bo'lishingiz mumkin. SetAgar 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 CopyOnWriteArraySetning 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 Setiterator 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 CopyOnWriteArraySetbo'lsa foydalaning setva 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.UnsupportedOperationExceptionquyida 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, CopyOnWriteArraySetbu 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;

/**
 * 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);
    }
}
Chiqish:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

Nimani eslash kerak

CopyOnWriteArraySetCollectionva interfeyslarini Set, shuningdek, JDK 1.5 da qo'shilgan boshqa Set"a," ilovasi bilan birgalikda amalga oshiradi EnumSet. Bu, shuningdek, barcha operatsiyalari uchun Setichki foydalanadi . CopyOnWriteArrayListShunday qilib, u ushbu sinfning bir xil asosiy xususiyatlariga ega. U bo'lmagani uchun SortedSetiteratsiya paytida elementlarning tartibi kafolatlanmaydi. Misol (tarjima) bilan Java-da CopyOnWriteArraySet-dan qanday foydalanish - 2
  1. CopyOnWriteArraySetQuyidagi ilovalar uchun eng mos keladi:

    • ning o'lchamlari Setkichik bo'lib qoladi.
    • Operatsiyalar read-onlyob'ektlarni o'zgartiradigan operatsiyalardan sezilarli darajada ustundir.
    • O'tish paytida iplar orasidagi shovqinni oldini olishingiz kerak Set.
  2. Yana bir afzallik CopyOnWriteArraySet- ipning xavfsizligi. Ushbu to'plam parallellikni qo'llab-quvvatlaydi.
  3. Mutativ operatsiyalar (qo'shish, o'zgartirish, o'chirish va boshqalar) qimmat, chunki ular odatda butun asosiy massivni nusxalashni talab qiladi.
  4. Iteratorlar mutatsiyali o'chirish operatsiyasini qo'llab-quvvatlamaydi.
  5. 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 CopyOnWriteArraySetJava-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 Setesa "', shuning uchun bu Java-da ushbu ma'lumotlar tuzilmalari o'rtasidagi barcha farqlarni meros qilib olishni talab qiladi. Misol uchun, Listelementlarning tartibi muhim va dublikatlarni o'z ichiga olishi mumkin. Tartibsiz bo'lsa-da Set, u ob'ektlarning takrorlanishiga yo'l qo'ymaydi. CopyOnWriteArraySetBu 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, LinkedHashSetyoki sinxronlashtirilgan yig'ish sinflari. Asl: Misol bilan Java-da CopyOnWriteArraySet-dan qanday foydalanish kerak
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION