JavaRush /Blog Java /Random-MS /Cara menggunakan CopyOnWriteArraySet dalam Java dengan co...
Lam-lam
Tahap

Cara menggunakan CopyOnWriteArraySet dalam Java dengan contoh (terjemahan)

Diterbitkan dalam kumpulan
CopyOnWriteArraySetNi adik kelas CopyOnWriteArrayList. Ini ialah set kelas khusus yang ditambahkan dalam JDK 1.5 bersama dengan sepupu mereka yang lebih popular ConcurrentHashMap. Ia adalah sebahagian daripada concurrent collection frameworkdan terletak dalam pakej java.util.concurrent. Cara menggunakan CopyOnWriteArraySet dalam Java dengan contoh (terjemahan) - 1CopyOnWriteArraySetPaling sesuai untuk koleksi baca sahaja yang bersaiz cukup kecil untuk disalin jika beberapa operasi pengubahsuaian berlaku. Sebagai contoh, anda boleh gunakan CopyOnWriteArraySetuntuk menyimpan objek apabila aplikasi dimulakan dan mempunyai beberapa utas lain mengakses objek itu sepanjang kitaran hayat aplikasi. Jika keadaan atau objek baharu tiba pada masa ini, ia juga boleh ditambahkan pada keadaan ini Set, dengan kos mencipta tatasusunan baharu. Salah satu perkara yang paling penting untuk diketahui CopyOnWriteArraySetialah ia dilaksanakan menggunakan CopyOnWriteArrayList. Ini bermakna ia CopyOnWriteArraySetjuga berkongsi semua sifat asas CopyOnWriteArrayList. Satu lagi perkara penting yang perlu diingat ialah iterator kelas koleksi ini tidak menyokong remove(). Percubaan untuk mengalih keluar elemen semasa penyepaduan akan menghasilkan outlier UnsupportedOperationException. Ini dilakukan untuk memastikan kelajuan semasa merangkak. Melintasi pelaksanaan ini Setmenggunakan iterator adalah agak pantas dan mengelakkan gangguan daripada utas lain. Untuk beroperasi, iterator bergantung pada petikan tatasusunan yang diambil semasa iterator dibuat. Ringkasnya, gunakan CopyOnWriteArraySetjika setcukup kecil untuk menyalin apabila menambah, menetapkan atau memadam objek, dan tujuan utama adalah untuk membaca data yang dikemas kini secara sporadis. Juga, jika anda ingin mengalih keluar elemen semasa lelaran, jangan gunakan pelaksanaan ini kerana iteratornya tidak menyokong remove(), dan throws java.lang.UnsupportedOperationException, seperti yang ditunjukkan di bawah:
[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)

Contoh CopyOnWriteArraySet dalam Java

Berikut ialah program Java siap pakai yang menunjukkan cara menggunakan CopyOnWriteArraySet. Dalam contoh kami, kami menggunakan corak penerbit -pelanggan untuk menunjukkan penggunaannya. Kebanyakan pelanggan melanggan semasa pelancaran aplikasi dan tugas utama penerbit adalah untuk menghitung mereka dan memberitahu mereka tentang sebarang kemas kini. Penambahan dan pemadaman pelanggan mungkin berlaku dari semasa ke semasa. Memandangkan kami memerlukan pintasan pantas, CopyOnWriteArraySetini adalah pilihan yang baik, terutamanya dalam persekitaran berbilang benang di mana satu utas boleh menambah pelanggan manakala urutan lain mengendalikan kemas kini.
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);
    }
}
Pengeluaran:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

Apa yang perlu diingat

CopyOnWriteArraySetmelaksanakan Collectiondan antara muka Set, serta, ditambah dalam JDK 1.5, bersama dengan satu lagi pelaksanaan tersuai Set'a, EnumSet. Ia juga merupakan Setsalah satu yang menggunakan dalaman CopyOnWriteArrayListuntuk semua operasinya. Oleh itu, ia berkongsi sifat asas yang sama bagi kelas ini. Oleh kerana ia bukan SortedSet, susunan elemen tidak dijamin semasa lelaran. Cara menggunakan CopyOnWriteArraySet dalam Java dengan contoh (terjemahan) - 2
  1. CopyOnWriteArraySetPaling sesuai untuk aplikasi di mana:

    • Saiz Set's cenderung kekal kecil.
    • Operasi read-onlyadalah jauh lebih baik daripada operasi yang mengubah suai objek.
    • Anda mesti mengelakkan gangguan antara benang semasa traversal Set.
  2. Kelebihan lain CopyOnWriteArraySetialah keselamatan benang. Koleksi ini menyokong konkurensi.
  3. Operasi mutatif (menambah, mengubah suai, memadam, dsb.) adalah mahal kerana ia biasanya memerlukan penyalinan keseluruhan tatasusunan asas.
  4. Iterator tidak menyokong operasi pemadaman mutatif.
  5. Traversal menggunakan iterator agak pantas dan semasa itu gangguan benang lain dikecualikan. Untuk beroperasi, iterator bergantung pada petikan tatasusunan yang diambil semasa iterator dibuat.
Itu semua tentang penggunaan CopyOnWriteArraySetdalam Java. Seperti yang saya katakan, dia adalah adik lelaki CopyOnWriteArrayList. Jadi jika anda memahami sekurang-kurangnya satu daripada mereka, anda boleh menggunakan yang lain. Satu-satunya perbezaan ialah satu adalah List'' dan satu lagi Setadalah '', jadi ini memerlukan mewarisi semua perbezaan antara struktur data ini di Jawa. Sebagai contoh, Listsusunan elemen adalah penting dan mungkin mengandungi pendua. Walaupun Settidak tertib, ia tidak membenarkan penduaan objek. Sentiasa ingat bahawa CopyOnWriteArraySetini adalah kelas khusus Collection. Ia hanya boleh digunakan apabila keadaan menggalakkan. Dalam sebarang kes lain, anda boleh menggunakan pelaksanaan tujuan umum. Contohnya, HashSet, LinkedHashSetatau kelas koleksi disegerakkan. Asal: Cara menggunakan CopyOnWriteArraySet dalam Java dengan Contoh
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION