ConcurrentHashMap สำหรับแต่ละวิธีเธรดปลอดภัยหรือไม่ [ซ้ำ]

Jan 05 2021

หากต้องการวนซ้ำองค์ประกอบทั้งหมดใน ConcurrentHashMap การใช้forEachเมธอดเธรดปลอดภัยหรือไม่

คำตอบ

1 JohnKugelman Jan 05 2021 at 11:08

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดยความปลอดภัยของเธรด

  • หากคุณโอเคกับเธรดอื่น ๆ ที่สามารถปรับเปลี่ยนแผนที่ได้ในขณะที่คุณอยู่ระหว่างการforEachโทรใช่แสดงว่าเธรดปลอดภัย
  • หากคุณต้องการให้แผนที่ไม่สามารถแก้ไขได้ในขณะที่forEachกำลังดำเนินการเพื่อให้เธรดอื่นถูกบล็อกหรือเกิดข้อผิดพลาดหากพยายามแก้ไขแล้วไม่แสดงว่าไม่เป็นเช่นนั้น

เอกสาร APIพูดว่า:

อย่างไรก็ตามแม้ว่าการดำเนินการทั้งหมดจะปลอดภัยต่อเธรด แต่การดำเนินการดึงข้อมูลไม่ได้ทำให้เกิดการล็อกและไม่มีการสนับสนุนใด ๆ สำหรับการล็อกตารางทั้งหมดในลักษณะที่ป้องกันการเข้าถึงทั้งหมด

...

ในทำนองเดียวกัน Iterators, Spliterators และ Enumerations จะส่งคืนองค์ประกอบที่สะท้อนถึงสถานะของตารางแฮช ณ จุดใดจุดหนึ่งหรือตั้งแต่การสร้างตัววนซ้ำ / ตัวแจงนับ พวกเขาไม่โยนConcurrentModificationException.... โปรดจำไว้ว่าผลลัพธ์ของวิธีการสถานะรวม ... โดยทั่วไปจะมีประโยชน์ก็ต่อเมื่อแผนที่ไม่ได้รับการอัปเดตพร้อมกันในเธรดอื่น ๆ มิฉะนั้นผลลัพธ์ของวิธีการเหล่านี้จะสะท้อนถึงสถานะชั่วคราวที่อาจเพียงพอสำหรับการตรวจสอบหรือการประมาณค่า แต่ไม่ใช่สำหรับการควบคุมโปรแกรม