1) Ini CopyOnWriteArraySet
adalah implementasi yang cukup sederhana - pada dasarnya memiliki daftar elemen dalam array, dan ketika mengubah daftar, itu menyalin array. Iterasi dan akses lain yang sedang berjalan saat ini dilanjutkan dengan array lama, menghindari keharusan sinkronisasi antara pembaca dan penulis (meskipun penulisan itu sendiri perlu disinkronkan). Operasi set yang biasanya cepat (terutama contains()
) cukup lambat di sini, karena array akan dicari dalam waktu linier.
Gunakan ini hanya untuk set yang sangat kecil yang akan sering dibaca (diulang) dan jarang diubah. (Swings listener-set akan menjadi contoh, tetapi ini sebenarnya bukan set, dan sebaiknya hanya digunakan dari EDT.)
2) Collections.synchronizedSet
hanya akan membungkus blok tersinkronisasi di sekitar setiap metode set asli. Anda tidak boleh mengakses set asli secara langsung. Ini berarti bahwa tidak ada dua metode set yang dapat dieksekusi secara bersamaan (satu akan memblokir hingga yang lain selesai) - ini aman untuk thread, tetapi Anda tidak akan memiliki konkurensi jika beberapa thread benar-benar menggunakan set. Jika Anda menggunakan iterator, Anda biasanya masih perlu melakukan sinkronisasi secara eksternal untuk menghindari ConcurrentModificationExceptions saat memodifikasi set antara panggilan iterator. Kinerja akan seperti kinerja set asli (tetapi dengan beberapa overhead sinkronisasi, dan pemblokiran jika digunakan secara bersamaan).
Gunakan ini jika Anda hanya memiliki konkurensi rendah, dan ingin memastikan semua perubahan langsung terlihat ke utas lainnya.
3) ConcurrentSkipListSet
adalah SortedSet
implementasi bersamaan , dengan sebagian besar operasi dasar di O (log n). Ini memungkinkan penambahan / penghapusan dan pembacaan / iterasi secara bersamaan, di mana iterasi mungkin atau mungkin tidak memberi tahu tentang perubahan sejak iterator dibuat. Operasi massal hanyalah beberapa panggilan tunggal, dan tidak secara atomis - utas lain hanya dapat mengamati beberapa dari mereka.
Jelas Anda dapat menggunakan ini hanya jika Anda memiliki beberapa urutan total pada elemen Anda. Ini terlihat seperti kandidat ideal untuk situasi konkurensi tinggi, untuk set yang tidak terlalu besar (karena O (log n)).
4) Untuk ConcurrentHashMap
(dan Set yang diturunkan darinya): Di sini sebagian besar opsi dasar adalah (rata-rata, jika Anda memiliki yang baik dan cepat hashCode()
) di O (1) (tetapi mungkin merosot ke O (n)), seperti untuk HashMap / HashSet. Ada konkurensi terbatas untuk penulisan (tabel dipartisi, dan akses tulis akan disinkronkan pada partisi yang diperlukan), sementara akses baca sepenuhnya bersamaan dengan dirinya sendiri dan utas penulisan (tetapi mungkin belum melihat hasil dari perubahan yang saat ini sedang berlangsung. tertulis). Iterator mungkin atau mungkin tidak melihat perubahan sejak dibuat, dan operasi massal tidak bersifat atomik. Mengubah ukuran lambat (seperti untuk HashMap / HashSet), jadi cobalah untuk menghindari ini dengan memperkirakan ukuran yang dibutuhkan saat pembuatan (dan menggunakan sekitar 1/3 lebih dari itu, karena ukurannya berubah ketika 3/4 penuh).
Gunakan ini ketika Anda memiliki set besar, fungsi hash yang baik (dan cepat) dan dapat memperkirakan ukuran set dan konkurensi yang diperlukan sebelum membuat peta.
5) Apakah ada implementasi peta bersamaan lainnya yang dapat digunakan di sini?