[Java] 자바에서 ConcurrentModificationException이 발생하는 이유와 해결 방법 | Map.keySet()

2023. 3. 3. 13:50·Java
목차
  1. ConcurrentModificationException 발생이유
  2. 문제 해결

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() 함수를 사용할 때는 이 점을 유의해야 합니다.

 


 

저작자표시 비영리 변경금지 (새창열림)
  1. ConcurrentModificationException 발생이유
  2. 문제 해결
'Java' 카테고리의 다른 글
  • [Java] 블랙 박스 테스트 & 화이트 박스 테스트 & 커버리지(Coverage) 예시
  • [Java] 재귀(Recursion) 함수란? 쉽게 이해해보자
  • [Java] Collection | 자바 List | ArrayList | 다양한 메소드
  • [Java] 자바 프로그래밍에서 흔히 발생하는 에러와 해결 방법!
Jelong
Jelong
커스텀 웹: https://jaehong-park.com Github: https://github.com/qkrwoghd04
  • Jelong
    24/7 Developer's Note
    Jelong
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Software Engineering
      • Ubuntu
      • Network
      • JavaScript
      • Web
      • Interaction Design
      • React Native
      • React
      • Algorithm
      • Java
      • Database design
      • IT Trend
      • TroubleShooting
      • AWS
      • Interview
      • LG CNS AM CAMP 1기
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    BST
    css
    generic
    prototyping
    heap
    이진트리
    React
    mininet
    블랙 박스 테스트
    오블완
    Queues
    java
    자바스크립트
    미니넷
    티스토리챌린지
    javascript
    frontend
    GPT-4
    JS
    소프트웨어 공학
    알고리즘 분석
    AWS
    자바
    html
    화이트 박스 테스트
    typescript
    ChatGPT
    expo
    알고리즘
    데이터 구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Jelong
[Java] 자바에서 ConcurrentModificationException이 발생하는 이유와 해결 방법 | Map.keySet()

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.