ConcurrentModificationException 발생이유
Java에서 ConcurrentModificationException은 하나 이상의 스레드가 동시에 컬렉션을 수정하려고 할 때 발생하는 예외입니다. 이 예외가 발생하면 프로그램이 예기치 않게 종료될 수 있습니다. 따라서 이 예외를 발생시키는 원인과 이를 해결하기 위한 방법을 이해하는 것은 중요합니다
쉽게 설명해서,
for(String key : map.keySet()){
map.put(key, 0)
}
위 코드에서 map.keySet() 함수를 사용하여 key를 하나씩 참조하는 작업을 수행하는 스레드(Thread)가 있습니다. 이 스레드는 현재 map을 순회하고 있습니다. 이 동안, 다른 스레드가 map.put(key, value)와 같은 함수를 사용하여 map을 수정하려고 하면, ConcurrentModificationException이 발생합니다. 이는 두 개 이상의 스레드가 동시에 map을 수정하려고 하기 때문입니다. 따라서, map의 동시 수정을 막기 위해서는 적절한 스레드 동기화 방식을 사용해야 합니다.
문제 해결
해결방법은 생각보다 간단한데, SetcopyOf()를 통해 키를 복사해서 아래와 같이 사용하면 에러가 발생하지 않습니다.
for(String key : SetcopyOf(map.keySet())){
map.put(key, 0)
}
Set.copyOf() 함수는 자바 10에서 추가된 함수로, 매개변수로 받은 Set을 복사한 새로운 Set을 생성합니다. 이 함수는 스레드 동기화를 보장하지 않습니다. 하지만 복사한 Set은 원본 Set과는 별개의 객체이므로, 복사한 Set을 사용하여 요소를 읽거나 수정해도 원본 Set에 영향을 미치지 않습니다
따라서, Set.copyOf() 함수를 사용하여 새로운 Set을 생성하면, 이 Set을 사용하는 스레드와 원본 Set을 수정하는 스레드 간에 스레드 동기화 문제가 발생하지 않습니다. 따라서, ConcurrentModificationException 오류가 발생하지 않습니다.
하지만 주의해야 할 점은, Set.copyOf() 함수는 복사한 Set을 변경할 수 없습니다. 즉, 생성된 Set은 읽기 전용이며, 추가, 수정, 삭제 등의 작업이 불가능합니다. 따라서, Set.copyOf() 함수를 사용할 때는 이 점을 유의해야 합니다.