ConcurrentLinkedQueue — 무경계 스레드 안전 FIFO 큐

ConcurrentLinkedQueue — 무경계 스레드 안전 FIFO 큐

ConcurrentLinkedQueue<E>연결된 노드 기반의 무경계(unbounded) 스레드 안전 큐예요. FIFO(선입선출) 순서로 요소를 정렬하며, 여러 스레드가 같은 컬렉션을 공유해 동시 접근해야 할 때 적합한 선택이에요.

출처: Java API Reference

본문

개념 이해하기

ConcurrentLinkedQueue는 FIFO(선입선출) 순서로 요소를 정렬하는 무경계 스레드 안전 큐예요. 머리(head)는 큐에 가장 오래 있었던 요소, 꼬리(tail)는 가장 짧게 있었던 요소예요. 새 요소는 꼬리에 삽입되고, 큐 조회 연산은 머리에서 얻어요.

public class ConcurrentLinkedQueue<E>
extends AbstractQueue<E>
implements Queue<E>, Serializable

구현은 Maged M. Michael과 Michael L. Scott의 "Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms"에 설명된 것을 기반으로 한 효율적인 논블로킹 알고리즘을 사용해요.

  • iterator는 약하게 일관적이며 ConcurrentModificationException을 던지지 않고 다른 연산과 동시에 진행될 수 있어요. iterator 생성 이후 큐에 있던 요소는 정확히 한 번 반환돼요.
  • 다른 대부분의 동시성 컬렉션처럼 null 요소를 허용하지 않아요.
  • size 메서드는 상수 시간 연산이 아니에요. 비동기 특성 때문에 O(n) 순회가 필요하고, 실행 중 요소가 추가/제거되면 부정확할 수 있어요. 그래서 동시성 애플리케이션에서 크게 유용하지 않을 수 있어요.
  • addAll, removeIf, forEach 같은 일괄 연산은 원자적 수행이 보장되지 않아요.

메모리 일관성 효과: 한 스레드가 큐에 객체를 넣기 전의 동작은 다른 스레드가 그 요소를 접근·제거한 이후의 동작보다 happen-before 관계예요.

생성자

public ConcurrentLinkedQueue() — 처음에 빈 큐를 만들어요.

public ConcurrentLinkedQueue(Collection<? extends E> c) — 주어진 컬렉션의 iterator 순회 순서대로 요소를 담은 큐를 만들어요.

  • NullPointerException — 컬렉션 또는 요소가 null일 때

큐 연산

public boolean add(E e) — 꼬리에 요소를 삽입해요. 무경계이므로 IllegalStateException도 던지지 않고 false도 반환하지 않아요.

  • NullPointerException

public boolean offer(E e) — 꼬리에 삽입해요. 무경계이므로 false를 반환하지 않아요.

public E poll() — 큐의 머리를 꺼내 제거하거나, 비어 있으면 null.

public E peek() — 머리를 제거하지 않고 반환하거나, 비어 있으면 null.

public boolean isEmpty() — 요소가 없으면 true.

public int size() — 요소 수를 반환해요. Integer.MAX_VALUE를 넘으면 Integer.MAX_VALUE. O(n) 순회가 필요하고 실행 중 변경되면 부정확할 수 있어요.

public boolean contains(Object o)o.equals(e)인 요소를 하나 이상 담고 있으면 true.

public boolean remove(Object o)o.equals(e)인 요소 하나를 제거해요. 큐가 변했으면 true.

public boolean addAll(Collection<? extends E> c) — 주어진 컬렉션 요소를 큐 끝에 순서대로 더해요. 큐를 자기 자신에 addAll하면 IllegalArgumentException.

public Object[] toArray() / public <T> T[] toArray(T[] a) — 요소를 순서대로 담은 배열을 반환해요.

public void clear()pollnull이 반환될 때까지 반복해 모든 요소를 제거해요.

public boolean removeIf(Predicate<? super E> filter), public boolean removeAll(Collection<?> c), public boolean retainAll(Collection<?> c), public void forEach(Consumer<? super E> action) — 표준 컬렉션 연산들.

iterator/spliterator

public Iterator<E> iterator() — 머리부터 꼬리 순서의 약하게 일관적 iterator를 반환해요.

public Spliterator<E> spliterator() — 약하게 일관적인 spliterator를 반환해요. CONCURRENT, ORDERED, NONNULL을 보고하며, trySplit으로 제한된 병렬 처리를 지원해요. (JDK 1.8+)

더 알아보기 (Learn more)