[JAVA] HashMap ConcurrentModificationException 발생 (keySet 사용시)

Cho-D-YoungRae·2022년 4월 2일
0

제가 JAVA 의 Map(HashMap)을 사용하다가 ConcurrentModificationException가 발생한 경우 중 Map.keySet()과 관련된 경우를 공유합니다.

문제 상황

public class Main {

    public static void main(String[] args) {
        Map<String, Integer> testMap = new HashMap<>();
        testMap.put("k1", 1);
        testMap.put("k2", 2);
        testMap.put("k3", 3);

        for (String key : testMap.keySet()) {	// ConcurrentModificationException 발생
            Integer value = testMap.remove(key);
            System.out.println("value = " + value);
        }
    }
}

위와 같은 상황에서 ConcurrentModificationException가 발생했습니다.
testMap.keySet() 이 for문에서 참조되면서 동시에 그 안에서 testMap.remove(key)로 해당 key와 value가 삭제되어서 발생하는 문제로 보입니다.

문제 해결

public class Main {

    public static void main(String[] args) {
        Map<String, Integer> testMap = new HashMap<>();
        testMap.put("k1", 1);
        testMap.put("k2", 2);
        testMap.put("k3", 3);

        for (String key : Set.copyOf(testMap.keySet())) { 	// keySet을 복사
            Integer value = testMap.remove(key);
            System.out.println("value = " + value);
        }
    }
}

문제를 해결하기 위해서 위와 같이 testMap.keySet()을 그대로 사용하지 않고 copy 해서 사용하면 문제를 해결할 수 있다.

0개의 댓글