CopyOnWriteArraySet
Ni 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 framework
dan terletak dalam pakej
java.util.concurrent
.
CopyOnWriteArraySet
Paling sesuai untuk koleksi baca sahaja yang bersaiz cukup kecil untuk disalin jika beberapa operasi pengubahsuaian berlaku. Sebagai contoh, anda boleh gunakan
CopyOnWriteArraySet
untuk 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
CopyOnWriteArraySet
ialah ia dilaksanakan menggunakan
CopyOnWriteArrayList
. Ini bermakna ia
CopyOnWriteArraySet
juga 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
Set
menggunakan iterator adalah agak pantas dan mengelakkan gangguan daripada utas lain. Untuk beroperasi, iterator bergantung pada petikan tatasusunan yang diambil semasa iterator dibuat. Ringkasnya, gunakan
CopyOnWriteArraySet
jika
set
cukup 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,
CopyOnWriteArraySet
ini 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;
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);
}
}
Pengeluaran:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Apa yang perlu diingat
CopyOnWriteArraySet
melaksanakan
Collection
dan antara muka
Set
, serta, ditambah dalam JDK 1.5, bersama dengan satu lagi pelaksanaan tersuai
Set
'a,
EnumSet
. Ia juga merupakan
Set
salah satu yang menggunakan dalaman
CopyOnWriteArrayList
untuk semua operasinya. Oleh itu, ia berkongsi sifat asas yang sama bagi kelas ini. Oleh kerana ia bukan
SortedSet
, susunan elemen tidak dijamin semasa lelaran.
-
CopyOnWriteArraySet
Paling sesuai untuk aplikasi di mana:
- Saiz
Set
's cenderung kekal kecil.
- Operasi
read-only
adalah jauh lebih baik daripada operasi yang mengubah suai objek.
- Anda mesti mengelakkan gangguan antara benang semasa traversal
Set
.
- Kelebihan lain
CopyOnWriteArraySet
ialah keselamatan benang. Koleksi ini menyokong konkurensi.
- Operasi mutatif (menambah, mengubah suai, memadam, dsb.) adalah mahal kerana ia biasanya memerlukan penyalinan keseluruhan tatasusunan asas.
- Iterator tidak menyokong operasi pemadaman mutatif.
- 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
CopyOnWriteArraySet
dalam 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
Set
adalah '', jadi ini memerlukan mewarisi semua perbezaan antara struktur data ini di Jawa. Sebagai contoh,
List
susunan elemen adalah penting dan mungkin mengandungi pendua. Walaupun
Set
tidak tertib, ia tidak membenarkan penduaan objek. Sentiasa ingat bahawa
CopyOnWriteArraySet
ini adalah kelas khusus
Collection
. Ia hanya boleh digunakan apabila keadaan menggalakkan. Dalam sebarang kes lain, anda boleh menggunakan pelaksanaan tujuan umum. Contohnya,
HashSet
,
LinkedHashSet
atau kelas koleksi disegerakkan. Asal:
Cara menggunakan CopyOnWriteArraySet dalam Java dengan Contoh
GO TO FULL VERSION