Bagaimana saya bisa membuat instance Daftar bersamaan, di mana saya dapat mengakses elemen berdasarkan indeks? Apakah JDK memiliki kelas atau metode pabrik yang dapat saya gunakan?
java
list
concurrency
AlikElzin-kilaka
sumber
sumber
List
yang aslinya khusus mengatakan adalah persyaratan yang dianggap vandalisme. Seorang moderator sudah mengunci pertanyaan karena orang-orang yang mengeluh bahwa jawaban tidak menjawab versi pertanyaan yang dirusak itu.locked
/closed
/ komentar sebelumnyaJawaban:
Ada implementasi daftar bersamaan di java.util.concurrent . CopyOnWriteArrayList pada khususnya.
sumber
Jika Anda tidak peduli tentang memiliki akses berbasis indeks dan hanya ingin karakteristik pelestarian urutan penyisipan Daftar, Anda dapat mempertimbangkan java.util.concurrent.ConcurrentLinkedQueue . Karena mengimplementasikan Iterable, setelah Anda selesai menambahkan semua item, Anda dapat mengulangi konten menggunakan sintaks yang ditingkatkan untuk:
sumber
:
) disebut foreach: docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.htmlAnda dapat menggunakan Collections.synchronizedList (Daftar) dengan sangat baik jika yang Anda butuhkan adalah sinkronisasi doa sederhana:
sumber
synchronizedList
"disinkronkan" tetapi tidak "bersamaan". Satu masalah mendasar yang banyak operasi Daftar - yang berbasis indeks - itu sendiri tidak atomik dan perlu menjadi bagian dari konstruksi pengecualian bersama yang lebih besar.Vector
lebih mudah daripadaCollections.synchronizedList(new ArrayList<Object>())
.Karena tindakan mendapatkan posisi dan mendapatkan elemen dari posisi yang diberikan secara alami memerlukan penguncian (Anda tidak dapat membuat daftar memiliki perubahan struktural antara kedua operasi).
Ide dari kumpulan konkuren adalah bahwa setiap operasi sendiri adalah atomik dan dapat dilakukan tanpa penguncian / sinkronisasi eksplisit.
Oleh karena itu mendapatkan elemen pada posisi
n
dariList
suatu operasi atom tidak masuk akal dalam situasi di mana akses bersamaan diantisipasi.sumber
Anda memiliki opsi ini:
Collections.synchronizedList()
: Anda dapat membungkusList
implementasi apa pun (ArrayList
,LinkedList
atau daftar pihak ketiga). Akses ke setiap metode (membaca dan menulis) akan dilindungi menggunakansynchronized
. Saat menggunakaniterator()
atau ditingkatkan untuk loop, Anda harus melakukan sinkronisasi secara manual; saat iterasi, utas lainnya sepenuhnya diblokir bahkan dari membaca. Anda juga dapat melakukan sinkronisasi secara terpisah untuk masing-masinghasNext
dannext
panggilan, tetapi kemudianConcurrentModificationException
dimungkinkan.CopyOnWriteArrayList
: mahal untuk dimodifikasi, tapi tunggu untuk dibaca. Iterator tidak pernah membuangConcurrentModificationException
, mereka mengembalikan snapshot dari daftar pada saat pembuatan iterator, bahkan jika daftar tersebut diubah oleh utas lain saat iterasi. Berguna untuk daftar yang jarang diperbarui. Operasi massal sepertiaddAll
lebih disukai untuk pembaruan - larik internal disalin lebih sedikit.Vector
: sangat miripsynchronizedList
, tapi iterasi juga disinkronkan. Namun, iterator dapat melemparConcurrentModificationException
, jika vektor dimodifikasi oleh utas lainnya saat iterasi.Pilihan lain:
Collections.unmodifiableList()
: bebas kunci, aman dari benang, tetapi tidak dapat dimodifikasiQueue
atauDeque
mungkin menjadi alternatif jika Anda hanya menambah / menghapus di ujung daftar dan beralih daftar. Tidak ada akses menurut indeks dan tidak ada penambahan / penghapusan di tempat sewenang-wenang. Mereka memiliki beberapa implementasi konkuren dengan kinerja yang lebih baik dan akses konkuren yang lebih baik, tetapi itu di luar cakupan pertanyaan ini. Anda juga dapat melihat JCTools , mereka mengandung lebih banyak implementasi antrian yang dikhususkan untuk konsumen tunggal atau produsen tunggal.sumber
CopyOnWriteArrayList adalah alternatif berbarengan dari antarmuka Daftar alat yang disinkronkan Daftar yang disinkronkan dan bagiannya dari paket java.util.concurrent dan koleksi yang aman.
CopyOnWriteArrayList gagal-aman dan tidak membuang ConcurrentModificationException ketika mendasari CopyOnWriteArrayList dimodifikasi selama Iterasi menggunakan salinan ArrayList yang terpisah.
Ini biasanya terlalu mahal karena array salin melibatkan setiap operasi pembaruan salinan kloning akan dibuat. CopyOnWriteArrayList adalah pilihan terbaik hanya untuk operasi baca yang sering.
http://gee.cs.oswussalamedu/dl/classes/EDU/oswego/cs/dl/util/concurrent/CopyOnWriteArrayList.html
https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
sumber