บทความนี้จะแนะนำให้คุณรู้จักกับแนวคิดที่เรียกว่า Concurrent Hash Map In และติดตามด้วยการสาธิตที่ใช้ได้จริงคำแนะนำต่อไปนี้จะกล่าวถึงในบทความนี้
- ConcurrentHashMap ทำงานภายในอย่างไร
- ทำไมแผนที่อื่น?
- มันแตกต่างกันอย่างไร?
- ความแตกต่างระหว่าง ConcurrentHashMap และ HashMap
- หลุมพราง
ไปต่อกับบทความนี้เกี่ยวกับ Concurrent Hash Map ใน Java
ConcurrentHashMap ทำงานภายในอย่างไร
ตั้งแต่ Java 5 เป็นต้นไป ConcurrentHashMap ถูกนำมาใช้เป็นทางเลือกสำหรับ HashTable นอกจากนี้เรายังสามารถรับแผนที่ที่ซิงโครไนซ์โดยใช้เมธอดคลาสยูทิลิตี้ที่เรียกว่า synchronizedMap () แต่มีข้อเสียเปรียบของวิธีนี้คือประสิทธิภาพที่แย่มากเนื่องจากมีเพียงเธรดเดียวเท่านั้นที่สามารถเข้าถึงได้ในครั้งเดียว ดังนั้น ConcurrentHashMap จึงจัดการกับปัญหาเหล่านี้
ไปต่อกับบทความนี้เกี่ยวกับ Concurrent Hash Map ใน Java
ทำไมแผนที่อื่น?
แม้ว่าเราจะมี HashMap อยู่แล้ว HashTable แต่สิ่งที่จำเป็นของ ConcurrentHashMap ก็เป็นเพราะมันให้ประสิทธิภาพที่ดีกว่าในเวลาเดียวกันจึงปลอดภัยต่อเธรด
ไปต่อกับบทความนี้เกี่ยวกับ Concurrent Hash Map ใน Java
มันแตกต่างกันอย่างไร?
นอกจากนี้ยังขึ้นอยู่กับการแฮช แต่ประสิทธิภาพจะดีขึ้นด้วยกลยุทธ์การล็อก ซึ่งแตกต่างจาก HashTable หรือ Synchronized HashMap จะไม่ใช้การล็อกเดียวกันในแต่ละวิธีโดยใช้การล็อกแยกกันสำหรับแต่ละวิธีโดยจะใช้การล็อกการเข้าใหม่เพื่อจุดประสงค์นี้ เช่นเดียวกับ HashMap ConcurrentHashMap มี 16 ที่เก็บข้อมูลเช่นเซ็กเมนต์เพื่อสร้าง ConcurrentHashMap ที่มีมากกว่า 16 ที่เก็บข้อมูลมีตัวสร้างที่แตกต่างกัน
goto c ++ ตัวอย่าง
ก่อนที่จะพูดคุยในรายละเอียดให้เราทบทวนแนวคิดบางประการด้านล่าง:
ConcurrentHashMap: แผนที่นี้อนุญาตให้เข้าถึงเธรดพร้อมกัน มีเพียงส่วนหนึ่งของแผนที่ที่เรียกว่าเซ็กเมนต์นั่นคือโครงสร้างข้อมูลพื้นฐานกำลังถูกล็อกขณะเพิ่มหรืออัปเดตแผนที่ อนุญาตให้เข้าถึงเธรดพร้อมกันเพื่ออ่านข้อมูลโดยไม่ต้องล็อก ได้รับการแนะนำเพื่อปรับปรุงประสิทธิภาพ
- Concurrency-Level: เป็นตัวเลขซึ่งเป็นจำนวนโดยประมาณของการอัปเดตเธรดพร้อมกัน
- Load-Factor: เป็นค่าที่ใช้ในการควบคุมปัจจัยการปรับขนาด
- ความจุเริ่มต้น: เป็นคุณสมบัติที่สร้างแผนที่ด้วยขนาดที่ระบุ
ลองดูแผนภาพด้านล่างและพยายามทำความเข้าใจว่า ConcurrentHashMap ทำงานอย่างไร
ดังนั้นในแผนภาพด้านบนเรามี 16 ล็อคซึ่งล็อคเฉพาะบางส่วนของแผนที่ที่จำเป็นเพื่อให้สามารถเข้าถึงวิธีการอื่นโดยเธรดที่แตกต่างกันซึ่งจะช่วยปรับปรุงประสิทธิภาพ
คล้ายกับ HashMap ConcurrentHashMap ทำงานในลักษณะเดียวกันโดยมี 16 เซ็กเมนต์ตามค่าเริ่มต้นและจัดเก็บองค์ประกอบโดยการแฮชดังนั้นหากองค์ประกอบมีแฮชเดียวกันจะถูกเก็บไว้ในส่วนเดียวกันดังที่แสดงในแผนภาพด้านบนด้วยความช่วยเหลือของรายการที่เชื่อมโยง
ไปต่อกับบทความนี้เกี่ยวกับ Concurrent Hash Map ใน Java
ความแตกต่างระหว่าง ConcurrentHashMap และ HashMap
HashMap เป็นของ Collections ในขณะที่ ConcurrentHashMap เป็นของ Concurrent Collections แต่ยังมีความแตกต่างอื่น ๆ อีกมากมาย
- ConcurrentHashMap คือเธรดปลอดภัยเช่นซิงโครไนซ์ แต่ HashMap ไม่ซิงโครไนซ์
- ConcurrentHashMap มีประสิทธิภาพต่ำเนื่องจากมีการซิงโครไนซ์เนื่องจากบางครั้งเธรดต้องรอ แต่ HashMap มีประสิทธิภาพสูงเนื่องจากไม่ซิงโครไนซ์และเธรดใด ๆ สามารถเข้าถึงได้พร้อมกัน
เราจะได้รับ ConcurrentModificationException หากสองเธรดพยายามแก้ไขหรือเพิ่มเนื้อหาของ Object พร้อมกัน อย่างไรก็ตามในกรณีของ ConcurrentHashMap เราจะไม่ได้รับข้อยกเว้นใด ๆ ในขณะที่ดำเนินการเดียวกัน
อนุญาตให้ใช้ค่า Null สำหรับคีย์และค่าใน HashMap อย่างไรก็ตาม ConcurrentHashMap ไม่อนุญาตให้ใช้ค่า null สำหรับคีย์และค่าที่พยายามเพิ่มค่า null เราจะได้รับข้อยกเว้นเช่น NullPointerException
HashMap เปิดตัวใน JDK 1.2 ในขณะที่ ConcurrentHashMap เปิดตัวใน JDK 1.5
ดังที่เราได้เห็นก่อนหน้านี้เพื่อประสิทธิภาพที่ดีขึ้นประกอบด้วยอาร์เรย์ของโหนดเป็นที่เก็บข้อมูลตารางซึ่งเป็นส่วนของตารางก่อนหน้านี้ จาวา 8 .
ที่เก็บข้อมูลจะเริ่มต้นอย่างเฉื่อยชาเมื่อทำการแทรกครั้งแรก ทุกที่เก็บข้อมูลสามารถล็อคได้อย่างอิสระโดยการล็อกโหนดแรกของที่เก็บข้อมูลและอ่านการดำเนินการไม่ปิดกั้น
เปรียบเทียบกับ HashMap พร้อมกัน ให้พิเศษ ระดับการทำงานพร้อมกัน อาร์กิวเมนต์เพื่อควบคุมจำนวนเธรดโดยประมาณที่จะใช้
ตัวสร้าง:
ConcurrentHashMap m = ConcurrentHashMap ใหม่ ()
แผนที่ว่างใหม่ถูกสร้างขึ้นโดยมีความจุเริ่มต้นเริ่มต้นที่ 16, โหลดแฟคเตอร์ 0.75 และระดับการทำงานพร้อมกัน 16
ConcurrentHashMap m = ConcurrentHashMap ใหม่ (int initialCapacity)
แผนที่ว่างใหม่ถูกสร้างขึ้นโดยมีความจุเริ่มต้นที่ระบุโหลดแฟคเตอร์ 0.75 และระดับการทำงานพร้อมกัน 16ConcurrentHashMap m = ConcurrentHashMap ใหม่ (int initialCapacity, float loadFactor)
แผนที่ว่างใหม่ถูกสร้างขึ้นด้วยความจุเริ่มต้นที่ระบุและปัจจัยการโหลดที่มีระดับ 16 พร้อมกัน
ConcurrentHashMap m = ConcurrentHashMap ใหม่ (int initialCapacity, float loadFactor, int concurrencyLevel)
แผนที่ว่างใหม่ถูกสร้างขึ้นพร้อมกับความจุเริ่มต้นที่ระบุโหลดแฟคเตอร์และระดับการทำงานพร้อมกันConcurrentHashMap m = ConcurrentHashMap ใหม่ (แผนที่ m)
สร้าง ConcurrentHashMap ใหม่จากแผนที่ที่ให้มา
อีกสองอาร์กิวเมนต์: initialCapacity และ loadFactor ทำงานค่อนข้างเหมือนกับ HashMap
ConcurrentMap เป็นหน่วยความจำที่สอดคล้องกับการดำเนินการคีย์ / ค่าในสภาพแวดล้อมแบบมัลติเธรด
ไปต่อกับบทความนี้เกี่ยวกับ Concurrent Hash Map ใน Java
หลุมพราง
ในขณะที่ดึงอ็อบเจ็กต์ ConcurrentHashMap จะไม่ถูกบล็อกและอาจทับซ้อนกับการดำเนินการอัพเดตดังนั้นเพื่อประสิทธิภาพที่ดีขึ้นพวกเขาจะดึงเฉพาะการดำเนินการอัพเดตที่เสร็จสมบูรณ์ล่าสุด
ผลลัพธ์ของเมธอดสถานะรวมรวมถึงขนาด isEmpty และ containValue มักจะมีประโยชน์เฉพาะเมื่อแผนที่ไม่ได้รับการอัพเดตพร้อมกันในเธรดอื่น
หากการอัปเดตพร้อมกันได้รับการควบคุมอย่างเหมาะสมวิธีการสถานะเหล่านี้สามารถเชื่อถือได้
แม้ว่าวิธีการเหล่านี้จะไม่รับประกันแบบเรียลไทม์
สร้าง java สตริงแบบสุ่ม
ความจุของตารางเริ่มต้นคือ 16 แต่เราสามารถเปลี่ยนได้โดยใช้ระดับการทำงานพร้อมกัน
ConcurrentHashMap สาธารณะ (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacityหากจำเป็นต้องใช้คีย์คีย์เพื่อเรียงลำดับเราสามารถใช้ ConcurrentSkipListMap
หลังจากเรียกใช้โปรแกรมข้างต้นแล้วคุณจะเข้าใจ Concurrent Hash Map ใน Java ดังนั้นเราจึงมาถึงตอนท้ายของบทความนี้แล้วหากคุณต้องการเรียนรู้เพิ่มเติมโปรดดูที่ไฟล์ บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ หลักสูตรการฝึกอบรมและการรับรอง Java J2EE และ SOA ของ Edureka ได้รับการออกแบบมาเพื่อฝึกอบรมคุณสำหรับแนวคิด Java ทั้งหลักและขั้นสูงพร้อมกับกรอบงาน Java ต่างๆเช่น Hibernate & Spring
มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของบทความนี้และเราจะติดต่อกลับโดยเร็วที่สุด