CodeGym /مدونة جافا /Random-AR /ConcurrentModificationException في جافا
John Squirrels
مستوى
San Francisco

ConcurrentModificationException في جافا

نشرت في المجموعة

ما هو ConcurrentModificationException في جافا؟

"يحدث 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);
			}
		}
	}
}

انتاج |

استثناء في مؤشر الترابط "الرئيسي" java.util.ConcurrentModificationException في java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) في java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) في height.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 في Java. لا تتردد في القفز عندما تشعر بأنك عالق. وكما هو الحال دائمًا، فإن مفتاح المضي قدمًا هو الممارسة والصبر. وحتى ذلك الحين، استمر في التعلم واستمر في النمو.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION