Java/Concurrency

Java > Concurrency > 9. Concurrent Collections

Krevis 2024. 10. 14. 06:59

java.util 패키지의 컬렉션 프레임워크

대부분 Thread safe하지 않음

 

단일 스레드가 컬렉션 사용 시 성능이 좋다

 

 

Collections.synchronized~ 동기화 메서드

스레드 안전하지 않은 많은 컬렉션들을 편리하게 스레드 안전한 컬렉션으로 변경해준다

 

단점

  • 동기화 오버헤드
  • 잠금 범위가 넓어져 잠금 경합(Lock contention) 증가, 병렬 처리 효율 저하
    • 모든 메서드에 동기화 적용
  • 정교한 동기화 불가
    • 과도한 동기화

 

 

java.util.concurrent 패키지의 컬렉션 프레임워크

위 방식의 단점 보완

자바 1.5부터 제공

 

스레드 안전하며 고성능 멀티 스레드 환경을 지원하는 다양한 동시성 컬렉션 클래스 제공

 

다양한 성능 최적화 기법이 적용되어 있다

  • synchronized
  • Lock (ReentrantLock)
  • CAS
  • 분할 잠금 기술 (Segment lock)
  • ..

 

종류

  • List
    • ArrayList
      • CopyOnWriteArrayList
  • Set
    • HashSet
      • CopyOnWriteArraySet
    • TreeSet
      •  ConcurrentSkipListSet
        • 정렬된 순서 유지. Comparator 사용 가능
  • Map
    • HashMap
      • ConcurrentHashMap
    • TreeMap
      • ConcurrentSkipListMap
        • 정렬된 순서 유지. Comparator 사용 가능
  • Queue
    • ConcurrentLinkedQueue
      • 동시성 큐. 비차단 (Non-blocking) 큐
  • Deque
    • ConcurrentLinkedDeque
      • 동시성 데크. 비차단 (Non-blocking) 큐

 

LinkedHashSet/Map처럼 입력 순서를 유지하는 동시에 멀티 스레드 환경에서 사용할 수 있는 구현체는 제공하지 않는다. 필요하면 Collections.synchronized~ 메서드를 사용해야 한다

 

스레드 차단 큐

  • BlockingQueue
    • ArrayBlockingQueue
      • 크기 고정 차단 큐
      • 공정 모드 사용 가능 (성능 저하)
    • LinkedBlockingQueue
      • 크기가 무한하거나 고정된 차단 큐
    • PriorityBlockingQueue
      • 우선순위가 높은 요소를 먼저 처리한느 차단 큐
    • SynchronousQueue
      • 데이터를 저장하지 않는 차단 큐
      • 생산자가 데이터를 추가하면 소비자가 데이터를 받을 때 대기한다
      • 생산자-소비자 간의 직접적인 Hand off 메커니즘 제공
        • 중간에 큐 없이 생산자, 소비자가 직접 거래한다
        • 생산자가 생산하면 대기한다(Block). 소비자가 큐에 있는 것을 요청하면 큐가 아닌 생산자가 바로 전달
      • 생산자와 소비자를 동기화하는 큐
    • DelayQueue
      • 지연된 요소를 처리하는 차단 큐
      • 각 요소는 지정된 지연시간이 지난 후에 소비할 수 있다
      • 일정 시간이 지난 후 작업을 처리해야 하는 스케줄링 작업에 사용된다

 

 

https://github.com/venzersiz/learn-java8/tree/master/src/test/java/concurrency/collection