반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- date
- IntelliJ
- 이탈리아
- 인텔리제이
- input
- string
- windows
- 이클립스
- table
- CMD
- 자바스크립트
- Eclipse
- vscode
- json
- CSS
- javascript
- Maven
- list
- Visual Studio Code
- 테이블
- js
- ArrayList
- 정규식
- 문자열
- Button
- Java
- 배열
- html
- Array
- 자바
Archives
- Today
- Total
어제 오늘 내일
[Java] Collections.synchronizedList()로 스레드 안전한 리스트 만들기 본문
멀티스레드 환경에서는 여러 스레드가 동시에 같은 리스트에 접근할 수 있습니다.
예를 들어, 한 스레드가 요소를 추가하는 동시에 다른 스레드가 요소를 삭제한다면 데이터 불일치나 ConcurrentModificationException이 발생할 수 있습니다.
이 문제를 해결하려면 리스트를 스레드 안전하게 만들어야 합니다.
이때 Collections.synchronizedList()
를 사용하면 간단하게 동기화된 리스트를 얻을 수 있습니다.
이 메서드는 멀티스레드 환경에서 스레드 안전(Thread-Safe) 한 리스트를 만들 때 사용합니다.
1. 기본 사용법
import java.util.*;
public class SyncListExample1 {
public static void main(String[] args) {
List<String> normalList = new ArrayList<>();
List<String> syncList = Collections.synchronizedList(normalList);
syncList.add("apple");
syncList.add("banana");
syncList.add("cherry");
System.out.println(syncList);
}
}
실행 결과
[apple, banana, cherry]
👉 ArrayList
를 감싼 스레드 안전 리스트가 만들어졌습니다.
2. 동기화된 반복문 사용하기
synchronizedList
는 메서드 호출(add, remove 등)은 자동으로 동기화되지만,
반복(iteration) 은 별도의 동기화 블록을 사용해야 안전합니다.
import java.util.*;
public class SyncListExample2 {
public static void main(String[] args) {
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
list.add(1);
list.add(2);
list.add(3);
// 안전한 반복
synchronized (list) {
for (int num : list) {
System.out.println(num);
}
}
}
}
👉 반복할 때는 synchronized(list)
블록으로 감싸야 합니다.
3. 활용 예시
- 멀티스레드 환경: 여러 스레드가 동시에 리스트에 접근할 때
- 로그 수집기: 여러 스레드에서 로그를 모아야 할 때
- 작업 큐: 스레드 간 데이터를 안전하게 공유할 때
4. 주의할 점
Collections.synchronizedList()
는 기존 리스트를 감싸는 래퍼(wrapper) 를 반환합니다.- 메서드 호출은 자동으로 동기화되지만, 반복문은 반드시 수동 동기화 필요합니다.
- 고성능 멀티스레드 환경에서는
CopyOnWriteArrayList
같은 대안이 더 적합할 수 있습니다.
5. 정리
Collections.synchronizedList(List<T> list)
👉 주어진 리스트를 감싼 스레드 안전 리스트 반환- 메서드 호출은 자동 동기화, 반복문은 수동 동기화 필요
- 멀티스레드 환경에서 안전하게 리스트를 사용할 수 있음
👉 여러 스레드에서 안전하게 List
를 쓰고 싶다면 Collections.synchronizedList()
로 감싸자!
반응형
'IT > Java' 카테고리의 다른 글
[Java] Collections.synchronizedSet()으로 스레드 안전한 집합 만들기 (0) | 2025.09.09 |
---|---|
[Java] Collections.synchronizedMap()으로 스레드 안전한 맵 만들기 (0) | 2025.09.09 |
[Java 기초] Collections.singletonMap()으로 단일 요소 불변 Map 만들기 (0) | 2025.09.08 |
[Java 기초] Collections.singleton()으로 단일 요소 불변 Set 만들기 (0) | 2025.09.07 |
[Java 기초] Collections.emptyMap()으로 비어있는 불변 Map 만들기 (0) | 2025.09.07 |
Comments