CodeGym /จาวาบล็อก /สุ่ม /ConcurrentModificationException ใน Java
John Squirrels
ระดับ
San Francisco

ConcurrentModificationException ใน Java

เผยแพร่ในกลุ่ม

ConcurrentModificationException ใน Java คืออะไร

“ConcurrentModificationException เกิดขึ้นเมื่อทรัพยากรได้รับการแก้ไขในขณะที่ไม่มีสิทธิ์ในการแก้ไข”
กล่าวอีกนัยหนึ่ง Java ConcurrentModificationException (ตามชื่อที่แนะนำ) เกิดขึ้นเนื่องจากปัญหาการทำงานพร้อมกัน จะถือว่าคุณมีความรู้มาก่อนเกี่ยวกับเธรด และมัลติเธรด ก่อนดำเนินการต่อ บางคลาสใน Java เช่นคลาส Collection ไม่อนุญาตให้เธรดแก้ไของค์ประกอบในขณะที่เธรดอื่นกำลังวนซ้ำอยู่ หากมีการ ดำเนินการแก้ไข (เพิ่ม ลบ ฯลฯ) โปรแกรมจะส่งConcurrentModificationException นี่ไม่ใช่กรณีเดียวเท่านั้นที่จะมีข้อยกเว้นนี้เกิดขึ้น อย่างไรก็ตาม การเจาะลึกลงไปจะไม่อยู่ในขอบเขตของบทความนี้

ตัวอย่าง

ลองดูตัวอย่างว่าข้อยกเว้นนี้เกิดขึ้นได้อย่างไร
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver1 {

	public static void main(String[] args) {
		List<String> businessDays = new ArrayList<>();

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");

		Iterator<String> iterator = businessDays.iterator();
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Sunday")) {
				// removing a list item while iterating
				// leading to java.util.ConcurrentModificationException
				businessDays.remove(day);
			}
		}
	}
}

เอาท์พุต

ข้อยกเว้นในเธรด "main" java.util.ConcurrentModificationException ที่ java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) ที่ java.base/java.util.ArrayList$Itr.next(ArrayList.java) :996) ที่ milestone.thirty.seven.ConcurrentModificationExceptionTestDriver1.main (ConcurrentModificationExceptionTestDriver1.java:22)

จะหลีกเลี่ยง ConcurrentModificationException ใน Java ได้อย่างไร

มีวิธีแก้ไขปัญหาที่แตกต่างกันสำหรับ ConcurrentModificationException นี่คือเกณฑ์บางส่วน คุณสามารถเลือกใครก็ได้ตามความต้องการของคุณ
  1. หลีกเลี่ยงการแก้ไขในขณะที่วนซ้ำ
  2. ใช้ลูปแบบดั้งเดิมสำหรับการวนซ้ำและการแก้ไขพร้อมกัน
  3. สร้างสำเนาของค่าที่จะแก้ไขขณะใช้ตัววนซ้ำ อัปเดตค่าเมื่อการวนซ้ำสิ้นสุดลง

ตัวอย่าง

นี่คือตัวอย่างวิธีที่คุณสามารถหลีกเลี่ยง ConcurrentModificationException
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver2 {

	public static void main(String[] args) {

		List<String> businessDays = new ArrayList<>();

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");

		System.out.println("Initial Business Days: " + businessDays);

		// Method II - Using traditional for loop
		for (int i = 0; i < businessDays.size(); i++) {
			if (businessDays.get(i).equals("Sunday")) {
				businessDays.remove(i);
			}
		}

		Iterator<String> iterator = businessDays.iterator();
		List<String> businessDaysToBeRemoved = new ArrayList<>();

		// Method III - Creating a copy of elements
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Saturday")) {
				// Add values to be removed in the list
				businessDaysToBeRemoved.add(day);
			}
		}
		businessDays.removeAll(businessDaysToBeRemoved);
		System.out.println("Final Business Days: " + businessDays);
	}
}

เอาท์พุต

วันทำการเริ่มต้น: [วันจันทร์ วันอังคาร วันพุธ วันพฤหัสบดี วันศุกร์ วันเสาร์ วันอาทิตย์] วันทำการสุดท้าย: [วันจันทร์ วันอังคาร วันพุธ วันพฤหัสบดี วันศุกร์]

บทสรุป

นั่นเป็นการจัดการกับConcurrentModificationExceptionใน Java อย่างรวดเร็ว กระโดดได้อย่างอิสระทุกครั้งที่คุณรู้สึกติดขัด เช่นเคย กุญแจสำคัญในการก้าวไปข้างหน้าคือการฝึกฝนและความอดทน ถึงตอนนั้น จงเรียนรู้และเติบโตต่อไป
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION