CopyOnWriteArraySet
Ini adalah adik laki-laki di kelasnya
CopyOnWriteArrayList
. Ini adalah serangkaian kelas khusus yang ditambahkan di JDK 1.5 bersama dengan sepupunya yang lebih populer
ConcurrentHashMap
. Mereka adalah bagian dari
concurrent collection framework
dan terletak di dalam paket
java.util.concurrent
.
CopyOnWriteArraySet
Paling cocok untuk koleksi baca-saja yang ukurannya cukup kecil untuk disalin jika terjadi beberapa operasi modifikasi. Misalnya, Anda dapat menggunakan
CopyOnWriteArraySet
untuk menyimpan objek saat aplikasi dimulai, dan meminta beberapa thread lain mengakses objek tersebut sepanjang siklus hidup aplikasi. Jika keadaan atau objek baru tiba pada waktu ini, keadaan atau objek tersebut juga dapat ditambahkan ke keadaan atau objek ini
Set
, dengan biaya pembuatan larik baru. Salah satu hal terpenting yang perlu diketahui
CopyOnWriteArraySet
adalah penerapannya menggunakan
CopyOnWriteArrayList
. Ini berarti ia
CopyOnWriteArraySet
juga berbagi semua properti dasar
CopyOnWriteArrayList
. Hal penting lainnya yang perlu diingat adalah bahwa iterator kelas koleksi ini tidak mendukung
remove()
. Mencoba menghapus elemen selama integrasi akan menghasilkan outlier
UnsupportedOperationException
. Hal ini dilakukan untuk memastikan kecepatan saat merangkak. Melintasi implementasi ini
Set
menggunakan iterator cukup cepat dan menghindari gangguan dari thread lain. Untuk beroperasi, iterator mengandalkan snapshot dari array yang diambil saat iterator dibuat. Singkatnya, gunakan
CopyOnWriteArraySet
jika
set
cukup kecil untuk disalin saat menambah, mengatur, atau menghapus objek, dan tujuan utamanya adalah untuk membaca data yang diperbarui secara sporadis. Selain itu, jika Anda ingin menghapus elemen selama iterasi, jangan gunakan implementasi ini karena iteratornya tidak mendukung
remove()
, dan throws
java.lang.UnsupportedOperationException
, seperti yang ditunjukkan di bawah ini:
[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 di Java
Berikut adalah program Java siap pakai yang menunjukkan cara menggunakan
CopyOnWriteArraySet
. Dalam contoh kami, kami menggunakan pola penerbit -pelanggan
untuk mendemonstrasikan penggunaannya. Sebagian besar pelanggan berlangganan selama peluncuran aplikasi dan tugas utama penerbit adalah menghitung mereka dan memberi tahu mereka tentang pembaruan apa pun. Penambahan dan penghapusan pelanggan dapat terjadi sewaktu-waktu. Karena kita memerlukan bypass yang cepat,
CopyOnWriteArraySet
ini adalah pilihan yang baik, terutama dalam lingkungan multi-thread di mana satu thread dapat menambahkan pelanggan sementara thread lain menangani pembaruan.
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);
}
}
Keluaran:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Apa yang perlu diingat
CopyOnWriteArraySet
mengimplementasikan antarmuka
Collection
and
Set
, serta, ditambahkan di JDK 1.5, bersama dengan implementasi khusus lainnya dari
Set
'a,
EnumSet
. Itu juga
Set
salah satu yang menggunakan internal
CopyOnWriteArrayList
untuk semua operasinya. Dengan demikian, ia memiliki sifat dasar yang sama dengan kelas ini. Karena tidak
SortedSet
, urutan elemen tidak dijamin selama iterasi.
-
CopyOnWriteArraySet
Paling cocok untuk aplikasi di mana:
- Ukurannya
Set
cenderung tetap kecil.
- Operasi
read-only
secara signifikan lebih unggul daripada operasi yang memodifikasi objek.
- Anda harus mencegah interferensi antar thread selama traversal
Set
.
- Keuntungan lainnya
CopyOnWriteArraySet
adalah keamanan benang. Koleksi ini mendukung konkurensi.
- Operasi mutatif (menambah, mengubah, menghapus, dll.) mahal karena biasanya memerlukan penyalinan seluruh array yang mendasarinya.
- Iterator tidak mendukung operasi penghapusan mutatif.
- Traversal menggunakan iterator cukup cepat dan selama itu gangguan dari thread lain tidak termasuk. Untuk beroperasi, iterator mengandalkan snapshot dari array yang diambil saat iterator dibuat.
Itu semua tentang penggunaan
CopyOnWriteArraySet
di Java. Seperti yang saya katakan, dia adalah adik laki-laki
CopyOnWriteArrayList
. Jadi jika Anda memahami setidaknya salah satunya, Anda bisa menggunakan yang lain. Satu-satunya perbedaan adalah yang satu adalah
List
'' dan yang lainnya
Set
adalah '', jadi ini memerlukan pewarisan semua perbedaan antara struktur data ini di Java. Misalnya,
List
urutan elemen penting dan mungkin mengandung duplikat. Meskipun
Set
tidak berurutan, ini tidak memungkinkan duplikasi objek. Ingatlah selalu bahwa
CopyOnWriteArraySet
ini adalah kelas khusus
Collection
. Ini hanya boleh digunakan ketika kondisinya mendukung. Dalam kasus lain, Anda dapat menggunakan implementasi tujuan umum. Misalnya,
HashSet
,
LinkedHashSet
atau kelas koleksi yang disinkronkan. Asli:
Cara menggunakan CopyOnWriteArraySet di Java dengan Contoh
GO TO FULL VERSION