자바
java.util.ConcurrentModificationException 에러
winwin-k9
2023. 2. 23. 15:57
리스트의 값을 remove하는 과정에서 다음과 같은 에러를 만났다.
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
단순 for를 이용하여 remove를 했을때는 에러발생이 없었지만, for each로 remove햇을때 에러가 발생했다.
List와 같은 객체를 for each 문을 돌릴 때, 해당 객체를 수정하면 발생한다고 한다. 그리고 보통 해당상황이 발생하는 경우는 크게 두가지 경우가 있다고 한다.
- 싱글 스레드 환경에서 for each문 중간에 객체를 수정하는 경우
- 멀티 스레드 환경에서, 다른 스레드에서 객체 값이 수정된 경우
어떠한 경우든 for each 중에 해당 객체를 수정한다는 사실은 동일하다. 결론적으로 이를 해결하기 위해서는
- for each 중에는 객체를 수정하지 않는다. 만약 수정해야 한다면 바로 break로 반복문을 빠져 나온다.
- 멀티 스레드 환경에서는, 객체 수정이 없는 단순 for each 문을 도는 중에도 에러가 발생할 수 있다. 다른 스레드에서 해당 객체를 수정할 수 있기 때문이다. 이럴때는 성능을 조금 손해보더라도 for each 문을 단순 for 문으로 바꾸는 것도 방법중 하나이다.
728x90