동시성 컬렉션

sungs·2025년 7월 19일

자바

목록 보기
46/95

동시성 컬렉션

멀티 스레드 환경에서 Collection을 사용할 수 있게 해준다.
java.util.concurrent 패키지에 있는데 cas 연산, 동기화, 락 등 다양한 방법들을 사용해서 멀티 스레드 환경에 맞게 최적화를 해놓았다.

종류

  • CopyOnWriteArrayList: ArrayList의 대안
  • CopyOnWriteArraySet: HashSet의 대안
  • ConcurrentSkipListSet: TreeSet의 대안(정렬된 순서 유지, Comparator 사용 가능)
  • ConcurrentHashMap: HashMap의 대안
  • ConcurrentSkipListMap: TreeMap의 대안(정렬된 순서 유지, Comparator 사용 가능)
  • ConcurrentLinkedQueue: 동시성 큐, 비 차단 큐이다
  • ConcurrentLinkedDeque: 동시성 데크, 비 차단 큐이다
  • ArrayBlockingQueue: 크기가 고정된 블로킹 큐, 공정 모드 사용 가능
  • LinkedBlockingQueue: 크기가 무한하거나 고정된 블로킹 큐
  • PriorityBlockingQueue: 우선 순위가 높은 요소를 먼저 처리하는 블로킹 큐
  • SynchronousQueue: 데이터를 저장하지 않은 블로킹 큐로, 생산자가 데이터를 생산하면 소비자가 받을 때까지 기다린다. 즉, 생산자와 소비자 간의 직거래 방식이다.
  • DelayQueue: 지연된 요소를 처리하는 큐로, 각 요소는 일정한 시간이 지난 후 사용할 수 있다.

LinkeHashMap,LinkedHashSet처럼 입력 순서 보장되면서 멀티 스레드 환경에서 안전 Set, Map 구현체는 제공하지 않는다. Collections.synchronizedXxx()을 사용해야 한다.

예제

 List<Integer> list = new CopyOnWriteArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

 System.out.println("초기 리스트: " + list);

일반적인 리스트처럼 구현하면 된다. 나머니도 구현 방법은 비슷하다.

동시성 컬렉션을 사용함으로써 멀티 스레드 환겨에서 컬렉션을 안전하게 사용할 수 있다.

Collections.synchronizedXxx()

프록시를 활용해서 만든, 컬렉션을 멀티 스레드 환경에서 안정하게 사용할 수 있도록 해주는 메서드다.

프록시(proxy)

클라이언트(요청하는 쪽)와 서버(서비스를 제공하는 쪽) 사이에서 중간 다리/대리인 역할을 하는 서버 또는 프로그램이다. 클라이언트의 요청을 직접 서버에 보내지 않고 프록시가 대신 받아서 서버에 전달하고, 서버의 응답도 프록시가 대신 받아서 클라이언트에게 전달해 주는 방식이라고도 할 수 있다.

이러한 방식을 통해 컬렉션에 전체적으로 synchronized 해서 만든 것이 Collections.synchronizedXxx()이다.

종류

  • synchronizedList()

  • synchronizedCollection()

  • synchronizedMap()

  • synchronizedSet()

  • synchronizedNavigableMap()

  • synchronizedNavigableSet()

  • synchronizedSortedMap()

  • synchronizedSortedSet()

    List<String> list = Collections.synchronizedList(new ArrayList<>()); 간다하게 사용하면서도 안전하게 컬렉션을 사용할 수 있다는 장점이 있다.

단점

전체적으로 동기화를 걸어버리는 바람에 필요 없는 부분까지 동기화를 걸어 버린다. 그러면 오버헤드가 발생할 수 있고 전체적으로 성능도 저하된다.
이러한 문제를 해결하기 위해 나온 것이 동시성 컬렉션이다.

profile
앱 개발 공부 중

0개의 댓글