CodeGym /בלוג Java /Random-HE /ConcurrentModificationException ב-Java
John Squirrels
רָמָה
San Francisco

ConcurrentModificationException ב-Java

פורסם בקבוצה

מה זה ConcurrentModificationException ב-Java?

"חריג ה- ConcurrentModification מתרחש כאשר משאב משתנה ללא הרשאות השינוי."
במילים אחרות, ה-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) ב-milstone.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