คำถามนี้สมควรได้รับคำตอบที่ดีกว่า
Java ConcurrentLinkedQueue
ขึ้นอยู่กับอัลกอริทึมที่มีชื่อเสียงของ Maged M. Michael และ Michael L. Scottสำหรับคิวที่ไม่มีการล็อคแบบไม่ปิดกั้น
"ไม่บล็อก" เป็นคำศัพท์สำหรับทรัพยากรที่ขัดแย้งกัน (คิวของเรา) หมายความว่าไม่ว่าตัวกำหนดตารางเวลาของแพลตฟอร์มจะทำอะไรเช่นการขัดจังหวะเธรดหรือหากเธรดที่เป็นปัญหาช้าเกินไปเธรดอื่น ๆ ที่ต่อสู้เพื่อทรัพยากรเดียวกัน จะยังคงสามารถดำเนินการต่อไปได้ หากเกี่ยวข้องกับการล็อกเช่นเธรดที่ยึดล็อกอาจถูกขัดจังหวะและเธรดทั้งหมดที่รอการล็อกนั้นจะถูกบล็อก Intrinsic locks ( synchronized
คีย์เวิร์ด) ใน Java อาจมาพร้อมกับบทลงโทษที่รุนแรงสำหรับประสิทธิภาพเช่นเมื่อล็อคเอนเอียงมีส่วนเกี่ยวข้องและคุณมีความขัดแย้งหรือหลังจาก VM ตัดสินใจที่จะ "ขยาย" การล็อกหลังจากระยะเวลาผ่อนผันการหมุนและบล็อกเธรดที่แข่งขันกัน ... ซึ่งเป็นเหตุผลว่าทำไมในหลาย ๆ บริบท (สถานการณ์ที่มีความขัดแย้งน้อย / ปานกลาง) ทำการเปรียบเทียบและ ชุดข้อมูลอ้างอิงอะตอมมีประสิทธิภาพมากขึ้นและนี่คือสิ่งที่โครงสร้างข้อมูลที่ไม่ปิดกั้นจำนวนมากกำลังทำอยู่
Java ConcurrentLinkedQueue
ไม่เพียง แต่ไม่ปิดกั้น แต่ยังมีคุณสมบัติที่ยอดเยี่ยมที่ผู้ผลิตไม่โต้แย้งกับผู้บริโภค ในสถานการณ์ผู้ผลิตรายเดียว / ผู้บริโภครายเดียว (SPSC) นั่นหมายความว่าจะไม่มีการโต้แย้งที่จะพูดถึง ในสถานการณ์ผู้ผลิตหลายราย / ผู้บริโภครายเดียวผู้บริโภคจะไม่โต้แย้งกับผู้ผลิต คิวนี้มีข้อขัดแย้งเมื่อผู้ผลิตหลายรายพยายามoffer()
แต่จะเกิดขึ้นพร้อมกันตามคำจำกัดความ โดยพื้นฐานแล้วมันเป็นจุดประสงค์ทั่วไปและไม่มีการปิดกั้นคิวที่มีประสิทธิภาพ
สำหรับการไม่เป็นBlockingQueue
เช่นนั้นการบล็อกเธรดเพื่อรอคิวเป็นวิธีที่แย่มากในการออกแบบระบบพร้อมกัน อย่า หากคุณคิดไม่ออกว่าจะใช้ConcurrentLinkedQueue
สถานการณ์ผู้บริโภค / ผู้ผลิตอย่างไรให้เปลี่ยนไปใช้นามธรรมระดับสูงเช่นกรอบงานนักแสดงที่ดี