JAVA | HashMap에서 ConcurrentModificationException 발생 시[해결]

728x90

JAVA | HashMap에서 ConcurrentModificationException 발생

  • HashMap<String, Integer> 을 선언해서, 각 닉네임 별로 중복 개수 카운팅 해둔 뒤,
  • for(String key : map.keySet()) {}으로 내부에서 if(map.get(key)==1) 인 경우, 현재 map에서 해당 key를 Remove() 처리 하는 과정에서 발생한 오류이다.
  • 이유는 ‘동시 수정 에러’ 이다. 즉, 기존 map에 존재하는 상태로 remove 하면서 계속 for문을 돌려니, 서로 다른 Thread가 같은 HashMap에 대한 연산을 수행하면서 충돌한 오류인 것이다.

⬛ 해결 1. 아예 keyMap의 key만 복제한 String[] 배열을 따로 만들기.

  • 이렇게 하면, 접근하는 keyArr와 삭제 대상인 map이 구분이 되므로 동시 수정 에러가 발생하지 않는다.
String[] keyArr = map.keySet().toArray(new String[map.size()]);
        for(String key : keyArr){
            if(map.get(key)==1) map.remove(key);
        }

 

⬛ 해결 2. CurrentHashMap으로 기존 HashMap 선언을 대체한다.

  • 이거는 동시 수정이 가능하도록 만들어진 HashMap이라서 함께 접근해도 문제되지 않고 정상 실행된다.
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
for(String key : map.keySet()){
    if(map.get(key) == 1) map.remove(key);
}
728x90