어제 오늘 내일

[Java] Collections.synchronizedList()로 스레드 안전한 리스트 만들기 본문

IT/Java

[Java] Collections.synchronizedList()로 스레드 안전한 리스트 만들기

hi.anna 2025. 9. 8. 12:55

멀티스레드 환경에서는 여러 스레드가 동시에 같은 리스트에 접근할 수 있습니다.
예를 들어, 한 스레드가 요소를 추가하는 동시에 다른 스레드가 요소를 삭제한다면 데이터 불일치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()로 감싸자!

 

 

반응형
Comments