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