병렬(동시성) 처리를 위한 Collection (ConcurrentLinkedQueue와 ConcurrentHashMap)

dykwon·2024년 1월 17일

Java의 ConcurrentLinkedQueue와 ConcurrentHashMap은 자바에서 동시성(Concurrency)을 다루기 위한 자료구조이다.
이 두 클래스는 멀티스레딩 환경에서 안전하게 사용할 수 있도록 설계되어 있다.

Collections.synchronizedXXX()를 이용하여 synchronized 되거나, Vector와 Hashtable같은 synchronized가 적용된 collection은 스레드에 안전하지만, 스레드 락에 의해 빠른 처리를 기대하긴 어렵다.

java.util.concurrent 패키지에 해당한다.

ConcurrentLinkedQueue

  1. Queue의 구현 클래스 이다.
  2. Lock-free 알고리즘을 구현할 클래스이다. Lock-free는 여러 개의 스레드가 동시에 접근 할 경우, 잠금 없이 최소한 하나의 스레드가 안전하게 요소를 저장하거나 얻도록 한다.
  3. List에 1,2,3 이 들어있는 경우 각 스레드가 Poll 했을 때 1,2,3이 순차적으로
ConcurrentLinkedQueue<String> concurrentQueue = new ConcurrentLinkedQueue<>();
concurrentQueue.add("Item1");
concurrentQueue.offer("Item2");
String item = concurrentQueue.poll();

ConcurrentHashMap

  1. Map의 구현 클래스이다.
  2. 스레드에 안전하면서도 멀티스레드가 요소를 병렬으로 처리할 수 있다.
  3. ConcurrentHashMap은 부문(Segment) 잠금 방식을 활용하여, 처리하는 요소가 포함된 부분만 잠금하고 나머지 부분은 다른 스레드에서 접근 할 수 있도록 한다.
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("Key1", 1);
concurrentMap.put("Key2", 2);
int value = concurrentMap.get("Key1");
profile
Programmer, who turns ideas into value

0개의 댓글