Exception in thread "main" java.util.ConcurrentModificationException

2023. 5. 18. 11:00

ConcurrentModificationException

❓ 문제 상황

2차원 배열을 입력받아 각 배열을 이용해서 만든 HashMap을 리턴하는 문제였다. 중요한 조건 중 하나가 중복되는 키가 있으면 저장된 초기값을 리턴해 줘야 하는 것이었는데 나는 HashMap에 먼저 담아두고 그 다음 중복되는 키를 찾아 삭제해 주자라는 생각을 하고 코드를 짰다. 

HashMap에 put() 을 해준 뒤 중복되는 키를 찾고 해당되는 키가 있으면 삭제하라는 코드를 작성하였으나 위와 같은 에러가 발생하였다. 

검색을 해보니 java.util.ConcurrentModificationException 에러는 두 가지 상황에 발생한다고 한다.

  • 반복자를 사용하여 컬렉션을 순회하고 있는 도중 컬렉션의 구조가 변경된 경우
  • 멀티스레드 환경에서 여러 스레드가 동시에 컬렉션을 수정하는 경우 

보통 첫 번째 경우가 많이 발생한다고 한다. 특히 컬렉션 객체에 remove 메서드를 호출할 때...!

 

즉, for문에 newMap.keySet()이 참조되면서 동시에 remove(key) 로 해당 key와 value가 삭제되면서 발생하는 문제였다.

 

Iterator를 사용한다거나 Set.copyOf() 메서드로 복사를 하여 사용하는 방법들이 있었지만... 애초에 코드를 잘못 짠 문제도 있고 해서 싹 뜯어 고쳤다. 애초에 put() 해서 키와 값을 넣어줄 때 중복된 값을 알아서 걸러주는데 그걸 생각을 못 하고 엉뚱하게 따로 삭제하는 코드를 만들어주니 수정해도 원하는 결과대로 나오지 않았다. 

 

 

그래서 중간에 키가 중복되는 게 없는 경우만 값을 넣어줄 수 있도록 변경해 주니 원하는 대로 값이 잘 출력되었다! 

 

 

 

BELATED ARTICLES

more