เช่นคอนเทนเนอร์ Map ใน Java:
สำหรับ(บุคคลบุคคล : pList){
ถ้า(person.getGender()==Gender.MALE){
pList.remove(person); //การดำเนินการลบไม่สามารถทำได้ในระหว่างการข้ามผ่าน
-
-
เมื่อสำรวจแผนที่ โดยปกติจะได้รับชุดของค่าคีย์ จากนั้นใช้ตัววนซ้ำเพื่อสำรวจแผนที่
โปรดทราบว่าในระหว่างกระบวนการสำรวจ มีเพียงองค์ประกอบในแผนที่เท่านั้นที่สามารถประมวลผลตามนั้นได้ กล่าวอีกนัยหนึ่งคือ ขนาดของแผนที่ไม่สามารถเปลี่ยนแปลงได้ และจะมีข้อยกเว้นเกิดขึ้น (ไม่สามารถใช้ในระหว่าง กระบวนการสำรวจเส้นทาง) แก้ไข ลบ หรือเพิ่มองค์ประกอบในแผนที่)
ข้อยกเว้นที่รายงานคือข้อยกเว้น java.util.ConcurrentModificationException
ConcurrentModificationExceptionextends RuntimeException คลาสสาธารณะ
ข้อยกเว้นนี้จะเกิดขึ้นเมื่อวิธีการตรวจพบการแก้ไขวัตถุพร้อมกัน แต่ไม่อนุญาตให้มีการแก้ไขดังกล่าว
ตัวอย่างเช่น ในขณะที่เธรดหนึ่งกำลังวนซ้ำบนคอลเลกชัน โดยทั่วไปเธรดอื่นจะไม่ได้รับอนุญาตให้แก้ไขคอลเลกชันเชิงเส้นตรง บ่อยครั้งในกรณีเหล่านี้ ผลลัพธ์ของการวนซ้ำไม่ชัดเจน การใช้งานตัววนซ้ำบางอย่าง (รวมถึงการใช้งานการรวบรวมทั่วไปทั้งหมดที่ JRE จัดเตรียมให้) อาจเลือกที่จะทิ้งข้อยกเว้นนี้หากตรวจพบลักษณะการทำงานนี้ ตัววนซ้ำที่ดำเนินการนี้เรียกว่าตัววนซ้ำที่ล้มเหลวอย่างรวดเร็ว เนื่องจากตัววนซ้ำจะล้มเหลวอย่างรวดเร็วโดยสมบูรณ์โดยไม่เสี่ยงต่อพฤติกรรมที่ไม่ได้ระบุตามอำเภอใจในบางครั้งในอนาคต
โปรดทราบว่าข้อยกเว้นนี้ไม่ได้บ่งชี้เสมอไปว่าวัตถุได้รับการแก้ไขพร้อมกันโดยเธรดที่แตกต่างกัน วัตถุอาจอยู่นอกกระบวนข้อยกเว้นนี้ถ้าเธรดเดี่ยวออกลำดับของการเรียกเมธอดที่ละเมิดสัญญาของวัตถุ ตัวอย่างเช่น หากเธรดแก้ไขคอลเลกชันโดยตรงในขณะที่วนซ้ำโดยใช้ตัววนซ้ำที่ล้มเหลวอย่างรวดเร็ว ตัววนซ้ำจะส่งข้อยกเว้นนี้
โปรดทราบว่าไม่รับประกันพฤติกรรมที่เร็วเมื่อเกิดความล้มเหลวของตัววนซ้ำ เนื่องจากโดยทั่วไปแล้ว ไม่สามารถรับประกันใดๆ ได้ว่าจะมีการแก้ไขที่เกิดขึ้นพร้อมกันโดยไม่ซิงโครไนซ์หรือไม่ การดำเนินการที่ล้มเหลวอย่างรวดเร็วทำให้เกิด ConcurrentModificationException บนพื้นฐานความพยายามที่ดีที่สุด ดังนั้นจึงเป็นความผิดพลาดในการเขียนโปรแกรมที่ใช้ข้อยกเว้นนี้เพื่อปรับปรุงความถูกต้องของการดำเนินการดังกล่าว วิธีการที่ถูกต้องคือ: ConcurrentModificationException ควรใช้เพื่อตรวจจับจุดบกพร่องเท่านั้น
เมื่อพยายามแก้ไขเนื้อหาของคอลเลกชัน/แผนที่โดยตรงในขณะที่ใช้ตัววนซ้ำที่รวดเร็วเมื่อล้มเหลวเพื่อวนซ้ำบนคอลเลกชันหรือแผนที่ ข้อยกเว้น java.util.ConcurrentModificationException จะถูกส่งออกมาแม้ว่าจะทำงานภายใต้เธรดเดียวก็ตาม
ตัววนซ้ำทำงานในเธรดแยกต่างหากและมีการล็อก mutex หลังจากสร้าง Iterator แล้ว ตารางดัชนีแบบลิงก์เดียวที่ชี้ไปยังออบเจ็กต์ต้นฉบับจะถูกสร้างขึ้น เมื่อจำนวนออบเจ็กต์ดั้งเดิมเปลี่ยนแปลง เนื้อหาของตารางดัชนีนี้จะไม่เปลี่ยนแปลงพร้อมกัน ดังนั้นเมื่อตัวชี้ดัชนีเลื่อนไปข้างหลังจะไม่สามารถ พบว่ามีการวนซ้ำวัตถุ ดังนั้นตามหลักการที่ล้มเหลวอย่างรวดเร็ว Iterator จะส่งข้อยกเว้น java.util.ConcurrentModificationException ทันที
ดังนั้นตัววนซ้ำไม่อนุญาตให้มีการเปลี่ยนแปลงวัตถุที่วนซ้ำในขณะที่กำลังทำงานอยู่ แต่คุณสามารถใช้เมธอดของ Iterator เพื่อลบอ็อบเจ็กต์ได้ เมธอด Iterator.remove() จะลบอ็อบเจ็กต์การวนซ้ำปัจจุบันในขณะที่ยังคงรักษาความสอดคล้องของดัชนีไว้
สิ่งที่น่าสนใจคือถ้าวัตถุ Collection / Map ของคุณมีเพียงองค์ประกอบเดียว ข้อยกเว้น ConcurrentModificationException จะไม่ถูกส่งออกไป นี่คือเหตุผลว่าทำไมจึงมีการชี้ให้เห็นใน javadoc: การเขียนโปรแกรมที่ขึ้นอยู่กับข้อยกเว้นนี้ในเรื่องความถูกต้องอาจเป็นเรื่องผิด: ConcurrentModificationException ควรใช้เพื่อตรวจจับจุดบกพร่องเท่านั้น