Pertanyaan ini membutuhkan jawaban yang lebih baik.
Java ConcurrentLinkedQueue
didasarkan pada algoritme terkenal oleh Maged M. Michael dan Michael L. Scott untuk antrean bebas kunci yang tidak memblokir .
"Non-pemblokiran" sebagai istilah di sini untuk sumber daya yang diperebutkan (antrean kami) berarti bahwa apa pun yang dilakukan penjadwal platform, seperti menyela untaian, atau jika untaian yang dipermasalahkan terlalu lambat, untaian lain bersaing untuk sumber daya yang sama akan tetap bisa maju. Jika ada kunci yang terlibat, misalnya, utas yang menahan kunci bisa terputus dan semua utas yang menunggu kunci itu akan diblokir. Kunci intrinsik ( synchronized
kata kunci) di Java juga dapat mengakibatkan hukuman yang berat untuk kinerja - seperti saat penguncian yang biasterlibat dan Anda memang memiliki perselisihan, atau setelah VM memutuskan untuk "memekarkan" kunci setelah masa tenggang putaran dan memblokir utas yang bersaing ... itulah sebabnya dalam banyak konteks (skenario pertengkaran rendah / menengah), melakukan bandingkan-dan -set pada referensi atom bisa jauh lebih efisien dan inilah yang dilakukan oleh banyak struktur data non-pemblokiran.
Java ConcurrentLinkedQueue
bukan hanya non-pemblokiran, tetapi juga memiliki properti luar biasa yang tidak bersaing dengan konsumen oleh produsen. Dalam skenario produsen / konsumen tunggal (SPSC), ini benar-benar berarti bahwa tidak akan ada perselisihan untuk dibicarakan. Dalam skenario banyak produsen / konsumen tunggal, konsumen tidak akan bersaing dengan produsen. Antrean ini memang memiliki perselisihan ketika beberapa produsen mencoba offer()
, tetapi menurut definisi itu konkurensi. Ini pada dasarnya adalah tujuan umum dan antrian non-pemblokiran yang efisien.
Adapun itu bukan BlockingQueue
, yah, memblokir utas untuk menunggu di antrian adalah cara yang sangat mengerikan untuk merancang sistem bersamaan. Jangan. Jika Anda tidak dapat menemukan cara menggunakan a ConcurrentLinkedQueue
dalam skenario konsumen / produsen, beralih saja ke abstraksi tingkat yang lebih tinggi, seperti kerangka aktor yang baik.