CodeGym /Blog Java /Ngẫu nhiên /Ngoại lệ sửa đổi đồng thời trong Java

Ngoại lệ sửa đổi đồng thời trong Java

Xuất bản trong nhóm

ConcurrentModificationException trong Java là gì?

“Ngoại lệ ConcurrentModificationException xảy ra khi một tài nguyên bị sửa đổi trong khi không có đặc quyền sửa đổi.”
Nói cách khác, Ngoại lệ Java ConcurrentModificationException (như tên gợi ý) xảy ra do vấn đề tương tranh. Giả định rằng bạn có kiến ​​thức trước về luồngđa luồng trước khi tiếp tục. Một số lớp trong Java, như các lớp Bộ sưu tập, không cho phép một luồng sửa đổi một phần tử trong khi một luồng khác đang lặp lại nó. Nếu thao tác sửa đổi (thêm, xóa, v.v.) được thực hiện, chương trình sẽ đưa ra ConcurrentModificationException . Đây không phải là trường hợp duy nhất xảy ra ngoại lệ này. Tuy nhiên, việc đào sâu hơn sẽ vượt ra ngoài phạm vi của bài viết này.

Ví dụ

Hãy xem một ví dụ về cách ngoại lệ này xảy ra.
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);
			}
		}
	}
}

đầu ra

Ngoại lệ trong luồng "chính" java.util.ConcurrentModificationException tại java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) tại java.base/java.util.ArrayList$Itr.next(ArrayList.java:996) tại Milestone.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Làm cách nào để tránh ConcurrentModificationException trong Java?

Có nhiều cách giải quyết khác nhau cho ConcurrentModificationException . Dưới đây là nhập ngũ một số. Bạn có thể lựa chọn bất cứ ai theo nhu cầu của bạn.
  1. Tránh sửa đổi trong khi lặp lại.
  2. Sử dụng các vòng lặp truyền thống để lặp lại và sửa đổi đồng thời.
  3. Tạo bản sao của các giá trị cần sửa đổi trong khi sử dụng trình vòng lặp. Cập nhật các giá trị sau khi quá trình lặp kết thúc.

Ví dụ

Đây là ví dụ về cách bạn có thể tránh 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);
	}
}

đầu ra

Ngày làm việc ban đầu: [Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu, Thứ Bảy, Chủ Nhật] Ngày làm việc cuối cùng: [Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu]

Phần kết luận

Đó là một cách nhanh chóng để xử lý ConcurrentModificationException trong Java. Hãy thoải mái nhảy lên bất cứ khi nào bạn cảm thấy bế tắc. Như mọi khi, chìa khóa để tiến về phía trước là luyện tập và kiên nhẫn. Cho đến lúc đó, hãy tiếp tục học hỏi và tiếp tục phát triển.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION