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?
java
concurrency
象 嘉 道
sumber
sumber
List
.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:
Satu- satunya
List
implementasi dijava.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 konkurenQueue
danMap
s (dan Anda dapat membuatnyaSet
dariMap
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:
sumber
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());
http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList(java.util.List)
sumber
ConcurrentHashMap
meskipun adaCollections.synchronizedMap
metode.ConcurrentHashMap
. Detail implementasi sinkronisasi berbeda. menggunakansynchronized
metode padaCollections
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.
sumber
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:
sumber
ConcurrentLinkedQueue
menggunakan antrian bebas kunci (berdasarkan instruksi CAS yang lebih baru ).sumber
List
antarmuka.List.set(int index, Object element)
dengan ConcurrentLinkedQueue?List
metode -spesifik tidak akan dapat diterapkan menggunakanQueue
(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 aQueue
boleh saja karena OP belum benar-benar menjelaskan kenapa mereka membutuhkan aList
.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.
sumber