1) CopyOnWriteArraySet
เป็นการใช้งานที่ค่อนข้างง่าย - โดยทั่วไปจะมีรายการองค์ประกอบในอาร์เรย์และเมื่อเปลี่ยนรายการจะคัดลอกอาร์เรย์ การทำซ้ำและการเข้าถึงอื่น ๆ ที่กำลังทำงานอยู่ในเวลานี้จะดำเนินต่อไปด้วยอาร์เรย์เก่าโดยหลีกเลี่ยงความจำเป็นในการซิงโครไนซ์ระหว่างผู้อ่านและผู้เขียน (แม้ว่าจะต้องทำการซิงโครไนซ์เองก็ตาม) การดำเนินการตั้งค่าอย่างรวดเร็วตามปกติ (โดยเฉพาะcontains()
) ค่อนข้างช้าที่นี่เนื่องจากอาร์เรย์จะถูกค้นหาในเวลาเชิงเส้น
ใช้สิ่งนี้สำหรับชุดเล็ก ๆ เท่านั้นซึ่งจะอ่าน (ซ้ำ) บ่อยครั้งและเปลี่ยนแทบไม่ (ชุดฟัง Swings น่าจะเป็นตัวอย่าง แต่สิ่งเหล่านี้ไม่ใช่ชุดจริงๆและควรใช้จาก EDT เท่านั้น)
2) Collections.synchronizedSet
จะห่อบล็อกซิงโครไนซ์รอบ ๆ แต่ละวิธีของชุดเดิม คุณไม่ควรเข้าถึงชุดเดิมโดยตรง ซึ่งหมายความว่าไม่สามารถดำเนินการสองวิธีของชุดพร้อมกันได้ (วิธีหนึ่งจะบล็อกจนกว่าอีกวิธีหนึ่งจะเสร็จสิ้น) - นี่คือเธรดที่ปลอดภัย แต่คุณจะไม่มีการทำงานพร้อมกันหากหลายเธรดใช้ชุดนี้จริงๆ หากคุณใช้ตัววนซ้ำคุณมักจะต้องซิงโครไนซ์ภายนอกเพื่อหลีกเลี่ยง ConcurrentModificationExceptions เมื่อแก้ไขชุดระหว่างการเรียกตัววนซ้ำ ประสิทธิภาพจะเหมือนกับประสิทธิภาพของชุดเดิม (แต่จะมีค่าใช้จ่ายในการซิงโครไนซ์บางส่วนและการบล็อกหากใช้พร้อมกัน)
ใช้สิ่งนี้หากคุณมีค่าการทำงานพร้อมกันต่ำและต้องการให้แน่ใจว่าเธรดอื่นจะมองเห็นการเปลี่ยนแปลงทั้งหมด
3) ConcurrentSkipListSet
เป็นการSortedSet
ใช้งานพร้อมกันโดยมีการดำเนินการขั้นพื้นฐานที่สุดใน O (log n) ช่วยให้สามารถเพิ่ม / ลบและอ่าน / ทำซ้ำได้พร้อมกันโดยที่การทำซ้ำอาจบอกหรือไม่บอกเกี่ยวกับการเปลี่ยนแปลงตั้งแต่สร้างตัววนซ้ำ การดำเนินการจำนวนมากเป็นเพียงการโทรหลายครั้งและไม่ใช่แบบอะตอมเธรดอื่น ๆ อาจสังเกตเห็นเพียงบางส่วนเท่านั้น
เห็นได้ชัดว่าคุณสามารถใช้สิ่งนี้ได้ก็ต่อเมื่อคุณมีลำดับทั้งหมดในองค์ประกอบของคุณ สิ่งนี้ดูเหมือนเป็นตัวเลือกที่เหมาะสำหรับสถานการณ์ที่มีความพร้อมกันสูงสำหรับชุดที่ไม่ใหญ่เกินไป (เนื่องจาก O (log n))
4) สำหรับConcurrentHashMap
(และชุดที่ได้มาจากมัน): ตัวเลือกพื้นฐานส่วนใหญ่คือ (โดยเฉลี่ยถ้าคุณมีดีและเร็วhashCode()
) ใน O (1) (แต่อาจลดลงเป็น O (n)) เช่น HashMap / แฮชเซ็ต การเขียนพร้อมกันมี จำกัด (ตารางถูกแบ่งพาร์ติชันและการเข้าถึงการเขียนจะถูกซิงโครไนซ์บนพาร์ติชันที่ต้องการ) ในขณะที่การเข้าถึงการอ่านจะทำงานพร้อมกันอย่างสมบูรณ์กับตัวมันเองและเธรดการเขียน (แต่อาจยังไม่เห็นผลลัพธ์ของการเปลี่ยนแปลงที่กำลังดำเนินอยู่ เขียน). ตัววนซ้ำอาจหรือไม่เห็นการเปลี่ยนแปลงตั้งแต่ถูกสร้างขึ้นและการดำเนินการจำนวนมากไม่ใช่ปรมาณู การปรับขนาดทำได้ช้า (สำหรับ HashMap / HashSet) ดังนั้นพยายามหลีกเลี่ยงปัญหานี้โดยการประมาณขนาดที่ต้องการในการสร้าง (และใช้อีกประมาณ 1/3 เนื่องจากจะปรับขนาดเมื่อ 3/4 เต็ม)
ใช้สิ่งนี้เมื่อคุณมีชุดใหญ่ฟังก์ชั่นแฮชที่ดี (และเร็ว) และสามารถประมาณขนาดชุดและการทำงานพร้อมกันที่จำเป็นก่อนสร้างแผนที่
5) มีการใช้งานแผนที่พร้อมกันอื่น ๆ ที่สามารถใช้ได้หรือไม่?