Java์—์„œ ConcurrentModificationException์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

โ€œ์ˆ˜์ • ๊ถŒํ•œ์ด ์—†๋Š” ์ƒํƒœ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ ConcurrentModificationException์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.โ€
์ฆ‰, ๋™์‹œ์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด Java ConcurrentModificationException (์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์† ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ์Šค๋ ˆ๋“œ ๋ฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์— ๋Œ€ํ•œ ์‚ฌ์ „ ์ง€์‹์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค . Collection ํด๋ž˜์Šค์™€ ๊ฐ™์€ Java์˜ ์ผ๋ถ€ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ๊ฐ€ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์ž‘์—…(์ถ”๊ฐ€, ์ œ๊ฑฐ ๋“ฑ)์ด ์ˆ˜ํ–‰๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์—์„œ 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.base/java.util.ArrayList$Itr.next(ArrayList.java)์˜ java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)์—์„œ ์Šค๋ ˆ๋“œ "main" java.util.ConcurrentModificationException์˜ ์˜ˆ์™ธ :996) ๋งˆ์ผ์Šคํ†ค.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Java์—์„œ 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);
	}
}

์‚ฐ์ถœ

์ตœ์ดˆ์˜์—…์ผ : [์›”,ํ™”,์ˆ˜,๋ชฉ,๊ธˆ,ํ† ,์ผ] ์ตœ์ข…์˜์—…์ผ : [์›”,ํ™”,์ˆ˜,๋ชฉ,๊ธˆ]

๊ฒฐ๋ก 

์ด๋Š” Java์—์„œ ConcurrentModificationException์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค . ๋ง‰ํžˆ๋Š” ๋Š๋‚Œ์ด ๋“ค ๋•Œ๋งˆ๋‹ค ์ž์œ ๋กญ๊ฒŒ ๋›ฐ์–ด์˜ค๋ฅด์„ธ์š”. ์–ธ์ œ๋‚˜ ๊ทธ๋ ‡๋“ฏ์ด, ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ์—ด์‡ ๋Š” ์—ฐ์Šต๊ณผ ์ธ๋‚ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐฐ์šฐ๊ณ  ๊ณ„์† ์„ฑ์žฅํ•˜์„ธ์š”.