Kumpulan utas saya memiliki jumlah utas tetap. Untaian ini perlu sering-sering menulis dan membaca dari daftar bersama.
Jadi, struktur data mana (sebaiknya Daftar, harus bebas monitor) dalam java.util.concurrent
paket yang terbaik dalam kasus ini?
Kumpulan utas saya memiliki jumlah utas tetap. Untaian ini perlu sering-sering menulis dan membaca dari daftar bersama.
Jadi, struktur data mana (sebaiknya Daftar, harus bebas monitor) dalam java.util.concurrent
paket yang terbaik dalam kasus ini?
ConcurrentModificationException
mungkin tidak berasal dari masalah sinkronisasi; itu juga muncul misalnya dalam perulangan-ke atas koleksi di mana Anda mencoba untuk menghapus elemen dari koleksi.
Vector
?
Jawaban:
lebih baik
List
Satu- satunya List
implementasi di java.util.concurrent
adalah CopyOnWriteArrayList . Ada juga opsi daftar yang disinkronkan seperti yang disebutkan Travis Webb.
Yang mengatakan, apakah Anda yakin Anda membutuhkannya List
? Ada lebih banyak opsi untuk konkuren Queue
dan Map
s (dan Anda dapat membuatnya Set
dari Map
s), dan struktur tersebut cenderung paling sesuai untuk banyak jenis hal yang ingin Anda lakukan dengan struktur data bersama.
Untuk antrian, Anda memiliki banyak sekali opsi dan mana yang paling sesuai bergantung pada bagaimana Anda perlu menggunakannya:
CopyOnWriteArrayList
memiliki kerugian menjadi sangat mahal untuk menulis (tetapi murah untuk membaca) Jika Anda melakukan banyak penulisan, lebih baik Anda menggunakan Daftar tersinkronisasi atau antrian.
Koleksi Java apa pun dapat dibuat agar aman untuk Thread seperti:
List newList = Collections.synchronizedList(oldList);
Atau untuk membuat daftar thread-safe baru:
List newList = Collections.synchronizedList(new ArrayList());
ConcurrentHashMap
meskipun ada Collections.synchronizedMap
metode.
ConcurrentHashMap
. Detail implementasi sinkronisasi berbeda. menggunakan synchronized
metode pada Collections
dasarnya hanya membungkus kelas dalam monitor Java. ConcurrentHashMap
menggunakan fitur konkurensi yang lebih pintar.
Jika ukuran daftar tetap, maka Anda dapat menggunakan AtomicReferenceArray . Ini akan memungkinkan Anda untuk melakukan pembaruan yang diindeks ke slot. Anda dapat menulis tampilan Daftar jika diperlukan.
Anda mungkin ingin melihat ConcurrentDoublyLinkedList ditulis oleh Doug Lea berdasarkan "A Practical Lock-Free Doubly-Linked List" dari Paul Martin. Itu tidak mengimplementasikan antarmuka java.util.List, tetapi menawarkan sebagian besar metode yang akan Anda gunakan dalam Daftar.
Menurut javadoc:
Implementasi daftar tertaut serentak dari Deque (antrean berujung ganda). Operasi penyisipan, penghapusan, dan akses bersamaan dijalankan dengan aman di beberapa utas. Iterator kurang konsisten , mengembalikan elemen yang mencerminkan status deque di beberapa titik atau sejak iterator dibuat. Mereka tidak menampilkan ConcurrentModificationException, dan dapat melanjutkan operasi lain secara bersamaan.
ConcurrentLinkedQueue
menggunakan antrian bebas kunci (berdasarkan instruksi CAS yang lebih baru ).
List
antarmuka.
List.set(int index, Object element)
dengan ConcurrentLinkedQueue?
List
metode -spesifik tidak akan dapat diterapkan menggunakan Queue
(tambahkan / setel pada indeks tertentu, misalnya) atau dapat diimplementasikan tetapi tidak efisien (dapatkan dari indeks). Jadi saya tidak berpikir Anda benar-benar bisa membungkusnya. Meski begitu, menurut saya saran a Queue
boleh saja karena OP belum benar-benar menjelaskan kenapa mereka membutuhkan a List
.
Jika set sudah cukup, ConcurrentSkipListSet mungkin digunakan. (Implementasinya didasarkan pada ConcurrentSkipListMap yang mengimplementasikan daftar lewati .)
Biaya waktu rata-rata yang diharapkan adalah log (n) untuk operasi berisi, menambah, dan menghapus; metode ukuran bukanlah operasi waktu-konstan.
List
.