ConcurrentHashMap (CHM สั้น ๆ ) ได้รับการแนะนำใหม่ใน Java 1.5 เป็นทางเลือกแทนการแฮชช์และเป็นสมาชิกที่สำคัญของแพ็คเกจพร้อมกัน ก่อน Java 1.5 หากคุณต้องการใช้แผนที่ที่สามารถใช้งานได้อย่างปลอดภัยในโปรแกรมแบบมัลติเธรดและพร้อมกันคุณสามารถเลือกได้จากแผนที่ Hashtable และซิงโครไนซ์เท่านั้นเนื่องจาก HASHMAP ไม่ปลอดภัย แต่หลังจากแนะนำ CHM เรามีทางเลือกที่ดีกว่า CHM ไม่เพียง แต่ปลอดภัยในเธรด แต่ยังทำงานได้ดีกว่า Hashtable และ SynchronizedMap เมื่อเปรียบเทียบกับ Hashtable และ SynchronizedMap แผนที่ทั้งหมดจะถูกล็อคและ CHM ล็อคแผนที่บางส่วนเท่านั้น CHM อนุญาตให้ดำเนินการอ่านพร้อมกันในขณะที่รักษาความสมบูรณ์ของข้อมูลในระหว่างการดำเนินการเขียนผ่านล็อคแบบซิงโครนัส เราได้เรียนรู้พื้นฐานของ CHM ใน 5 อันดับแรกของคอลเล็กชั่น Java พร้อมกันจาก JDK 5 และ 6 ในบล็อกนี้ฉันจะแนะนำประเด็นต่อไปนี้:
การดำเนินการตามกัน
CHM แนะนำการแบ่งส่วนและให้คุณสมบัติทั้งหมดที่รองรับโดย Hashtable ใน CHM การมัลติเธรดได้รับการสนับสนุนเพื่ออ่านแผนที่และไม่จำเป็นต้องมีการบล็อกใด ๆ นี่เป็นเพราะความจริงที่ว่า CHM แยกแผนที่ออกเป็นส่วนต่าง ๆ โดยล็อคเพียงส่วนหนึ่งของมันเมื่อดำเนินการอัปเดต ตามระดับการเกิดขึ้นพร้อมกันเริ่มต้นแผนที่แบ่งออกเป็น 16 ส่วนและถูกควบคุมโดยล็อคที่แตกต่างกัน ซึ่งหมายความว่าเธรดการเขียนสูงสุด 16 รายการสามารถใช้งานแผนที่ได้ในเวลาเดียวกัน แค่คิดว่าจากเธรดเดียวเท่านั้นที่เข้าสู่เธรดเขียน 16 รายการที่เข้ามาในเวลาเดียวกัน (อ่านเธรดเกือบไม่ จำกัด ) การปรับปรุงประสิทธิภาพนั้นชัดเจน อย่างไรก็ตามเนื่องจากการดำเนินการอัปเดตบางอย่างเช่น put (), remove (), putall () และ clear () เพียงล็อคการดำเนินการเท่านั้นการดำเนินการค้นหาไม่สามารถรับประกันได้ว่าผลลัพธ์ล่าสุดจะถูกส่งคืน
อีกจุดสำคัญคือเมื่อวนซ้ำ CHM ตัววนซ้ำที่ส่งคืนโดยปุ่มกดนั้นมีความสอดคล้องกันอย่างอ่อนแอและไม่ปลอดภัยและอาจไม่คืนการเปลี่ยนแปลงล่าสุด ในระหว่างการสำรวจหากเนื้อหาในอาร์เรย์ที่ได้รับการเปลี่ยนแปลงผ่านการเปลี่ยนแปลงที่เกิดขึ้นพร้อมกันยกเว้น Exceptoin จะไม่ถูกโยนทิ้ง
ระดับการเกิดพร้อมกันเริ่มต้นของ CHM คือ 16 แต่สามารถเปลี่ยนแปลงได้โดยตัวสร้างเมื่อสร้าง CHM ไม่ต้องสงสัยเลยว่าระดับการเกิดพร้อมกันแสดงถึงจำนวนการดำเนินการอัปเดตพร้อมกันดังนั้นหากมีเพียงไม่กี่เธรดที่จะอัปเดตแผนที่แนะนำให้ตั้งค่าระดับการพร้อมกันต่ำ นอกจากนี้ CHM ยังใช้ reentrantlock เพื่อล็อคเซ็กเมนต์
ตัวอย่างของวิธีการ putifabsent ใน java
หลายครั้งที่เราต้องการแทรกองค์ประกอบเมื่อไม่มีอยู่และเรามักจะเขียนโค้ดดังต่อไปนี้
ซิงโครไนซ์ (แผนที่) {ถ้า (map.get (คีย์) == null) {return map.put (คีย์, ค่า); } else {return map.get (คีย์); -รหัสข้างต้นใช้งานง่ายใน HashMap และ Hashtable แต่มีความเสี่ยงต่อข้อผิดพลาดใน CHM นี่เป็นเพราะ CHM ไม่ได้ล็อคแผนที่ทั้งหมดในระหว่างการดำเนินการดังนั้นเมื่อใส่เธรดหนึ่ง (K, V) การเรียกเธรดอื่นจะได้รับ (K) และรับ NULL ซึ่งจะทำให้ค่าของเธรดหนึ่งถูกเขียนทับโดยค่าของเธรดอื่นที่ใส่ แน่นอนคุณสามารถห่อหุ้มรหัสลงในบล็อกรหัสที่ซิงโครไนซ์ซึ่งจะทำให้รหัสของคุณเป็นเธรดเดี่ยวแม้ว่าจะปลอดภัยกับเธรด วิธีการ putifabsent (คีย์, ค่า) ที่จัดทำโดย CHM ใช้ฟังก์ชั่นเดียวกันกับอะตอมในขณะที่หลีกเลี่ยงความเสี่ยงของการแข่งขันเธรดข้างต้น
เมื่อใดควรใช้พร้อมกัน
CHM เหมาะสำหรับเมื่อจำนวนผู้อ่านเกินจำนวนผู้อ่านและเมื่อจำนวนผู้อ่านมากกว่าหรือเท่ากับผู้อ่านประสิทธิภาพของ CHM จะต่ำกว่าแผนที่แฮชและซิงโครไนซ์ นี่เป็นเพราะเมื่อแผนที่ทั้งหมดถูกล็อคการดำเนินการอ่านจะรอเธรดที่ดำเนินการเขียนไปยังส่วนเดียวกันถึงจุดสิ้นสุด CHM เหมาะสำหรับการสร้างแคชเริ่มต้นที่จุดเริ่มต้นของโปรแกรมและสามารถเข้าถึงได้โดยหลายเธรดที่ร้องขอ ดังที่ Javadoc อธิบาย CHM เป็นทางเลือกที่ดีสำหรับการแฮชช์ แต่โปรดจำไว้ว่า CHM มีการซิงโครไนซ์น้อยกว่าแฮชต์
สรุป
ตอนนี้เรารู้แล้วว่ามีอะไรเกิดขึ้นพร้อมกันและเมื่อใดควรใช้พร้อมกัน ลองตรวจสอบประเด็นสำคัญของ CHM
ข้างต้นเป็นสถานการณ์การใช้งานและการใช้งานของ CHM ใน Java ฉันหวังว่ามันจะช่วยทุกคนได้! ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!