CodeGym /وبلاگ جاوا /Random-FA /ConcurrentModificationException در جاوا
John Squirrels
مرحله
San Francisco

ConcurrentModificationException در جاوا

در گروه منتشر شد

ConcurrentModificationException در جاوا چیست؟

"ConcurrentModificationException زمانی رخ می دهد که یک منبع اصلاح شود در حالی که امتیازات اصلاح را ندارد."
به عبارت دیگر، Java ConcurrentModificationException (همانطور که از نام آن پیداست) به دلیل مشکل همزمانی رخ می دهد. فرض بر این است که قبل از ادامه، اطلاعات قبلی در مورد رشته ها و چند رشته ای دارید . برخی از کلاس‌های جاوا، مانند کلاس‌های مجموعه، به یک رشته اجازه نمی‌دهند یک عنصر را در حالی که رشته‌ای دیگر روی آن تکرار می‌شود، تغییر دهد. اگر عملیات اصلاح (افزودن، حذف و غیره) انجام شود، برنامه 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.javaray :996) در milestone.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

چگونه از ConcurrentModificationException در جاوا جلوگیری کنیم؟

راه حل های مختلفی برای 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 در جاوا بود. با خیال راحت هر زمان که احساس کردید گیر کرده اید، به آن بروید. مثل همیشه، کلید حرکت رو به جلو تمرین و صبر است. تا آن زمان، به یادگیری ادامه دهید و به رشد خود ادامه دهید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION