HashMap เทียบกับ เทียบกับ HashMap พร้อมกัน SynchronizedMap - HashMap สามารถซิงโครไนซ์ใน Java . ได้อย่างไร

เผยแพร่แล้ว: 2015-01-29

กระทืบ ConcurrentHashMap กับ ตัวอย่างแผนที่ที่ซิงโครไนซ์ HashMap เป็นโครงสร้างข้อมูลที่ทรงพลังมากใน Java เราใช้ทุกวันและแทบทุกแอปพลิเคชัน มีตัวอย่างบางส่วนที่ฉันได้เขียนไว้ก่อนหน้านี้เกี่ยวกับวิธีการใช้งานแคช Threadsafe, วิธีแปลง Hashmap เป็น Arraylist?

เราใช้ Hashmap ในทั้งสองตัวอย่างด้านบน แต่สิ่งเหล่านี้เป็นกรณีการใช้งานที่ค่อนข้างง่ายของ Hashmap HashMap is a non-synchronized

คุณมีคำถามด้านล่างหรือไม่?

  • ConcurrentHashMap และ Collections.synchronizedMap (แผนที่) แตกต่างกันอย่างไร
  • ConcurrentHashMap และ Collections.synchronizedMap (Map) แตกต่างกันอย่างไรในแง่ของประสิทธิภาพ
  • ConcurrentHashMap กับ Collections.synchronizedMap ()
  • คำถามสัมภาษณ์ HashMap และ ConcurrentHashMap ยอดนิยม

ในบทช่วยสอนนี้ เราจะอธิบายคำถามข้างต้นทั้งหมดและให้เหตุผล why and how เราจะซิงโครไนซ์ Hashmap ได้อย่างไร

ทำไม?

ออบเจ็กต์ Map เป็นคอนเทนเนอร์ที่เชื่อมโยงกันซึ่งเก็บองค์ประกอบ ซึ่งเกิดขึ้นจากการรวมกันของ key ระบุเฉพาะและ value ที่แมป หากคุณมีแอปพลิเคชันที่ทำงานพร้อมกันอย่างมากซึ่งคุณอาจต้องการแก้ไขหรืออ่านค่าคีย์ในเธรดต่างๆ กัน ขอแนะนำให้ใช้ Concurrent Hashmap ตัวอย่างที่ดีที่สุดคือ Producer Consumer ซึ่งจัดการการอ่าน/เขียนพร้อมกัน

แล้ว Thread-safe Map หมายความว่าอย่างไร? หาก multiple threads เข้าถึงแม็พแฮชพร้อมกัน และเธรดอย่างน้อยหนึ่งเธรดแก้ไขโครงสร้างแม็พ จะ must be synchronized externally เพื่อหลีกเลี่ยงมุมมองเนื้อหาที่ไม่สอดคล้องกัน

ยังไง?

มีสองวิธีที่เราสามารถซิงโครไนซ์ HashMap

  1. Java Collections synchronizedMap() method
  2. ใช้ ConcurrentHashMap

ConcurrentHashMap

  • คุณควรใช้ ConcurrentHashMap เมื่อคุณต้องการการทำงานพร้อมกันที่สูงมากในโครงการของคุณ
  • เป็นเธรดที่ปลอดภัยโดยไม่ต้องซิงโครไนซ์ whole map
  • การอ่านสามารถเกิดขึ้นได้เร็วมากในขณะที่เขียนเสร็จโดยมีการล็อก
  • ไม่มีการล็อคที่ระดับวัตถุ
  • การล็อกมีความละเอียดที่ละเอียดกว่ามากที่ระดับบัคเก็ตแฮชแมป
  • ConcurrentHashMap จะไม่ส่ง ConcurrentModificationException หากเธรดหนึ่งพยายามแก้ไขในขณะที่อีกเธรดหนึ่งกำลังวนซ้ำ
  • ConcurrentHashMap ใช้การล็อกจำนวนมาก

SynchronizedHashMap

  • การซิงโครไนซ์ที่ระดับวัตถุ
  • การดำเนินการอ่าน/เขียนทุกครั้งจำเป็นต้องได้รับการล็อก
  • การล็อกคอลเลคชันทั้งหมดเป็นค่าใช้จ่ายด้านประสิทธิภาพ
  • โดยพื้นฐานแล้วจะสามารถเข้าถึงเธรดเดียวในแผนที่ทั้งหมด & บล็อกเธรดอื่นทั้งหมด
  • อาจทำให้เกิดการทะเลาะวิวาท
  • SynchronizedHashMap ส่งคืน Iterator ซึ่งล้มเหลวอย่างรวดเร็วในการแก้ไขพร้อมกัน

ทีนี้มาดูโค้ดกัน

  1. สร้างคลาส CrunchifyConcurrentHashMapVsSynchronizedHashMap.java
  2. สร้างวัตถุสำหรับแต่ละ HashTable, SynchronizedMap และ CrunchifyConcurrentHashMap
  3. เพิ่มและดึงข้อมูล 500,000 รายการจาก Map
  4. วัดเวลาเริ่มต้นและสิ้นสุดและแสดงเวลาเป็นมิลลิวินาที
  5. เราจะใช้ ExecutorService เพื่อรัน 5 threads แบบขนาน

นี่คือรหัส Java:

  • shutdown() หมายความว่าบริการตัวดำเนินการจะไม่รับงานที่เข้ามาอีก
  • awaitTermination() ถูกเรียกใช้หลังจากคำขอปิดระบบ

ดังนั้น คุณต้องปิด serviceExecutor ก่อน จากนั้นจึงบล็อกและรอให้เธรดเสร็จสิ้น

ผลลัพธ์ของคอนโซล Eclipse: