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.concurrentpaket 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.concurrentpaket yang terbaik dalam kasus ini?
ConcurrentModificationExceptionmungkin 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.concurrentadalah 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 Queuedan Maps (dan Anda dapat membuatnya Setdari Maps), 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:
CopyOnWriteArrayListmemiliki 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());
ConcurrentHashMapmeskipun ada Collections.synchronizedMapmetode.
ConcurrentHashMap. Detail implementasi sinkronisasi berbeda. menggunakan synchronizedmetode pada Collectionsdasarnya hanya membungkus kelas dalam monitor Java. ConcurrentHashMapmenggunakan 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.
ConcurrentLinkedQueuemenggunakan antrian bebas kunci (berdasarkan instruksi CAS yang lebih baru ).
Listantarmuka.
List.set(int index, Object element)dengan ConcurrentLinkedQueue?
Listmetode -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 Queueboleh 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.