SynchronousQueue
(다른 질문 에서 발췌 )
SynchronousQueue
LinkedBlockingQueue
단일 요소를 허용하는 반면, 더 많은 핸드 오프 입니다. 차이가 있다고되는 put()
(A)에 호출 SynchronousQueue
대응있을 때까지 리턴되지 take()
호출하지만과 LinkedBlockingQueue
크기 1의 put()
(비어있는 큐) 호출은 즉시 복귀된다. 그것은 BlockingQueue
실제로 큐를 원하지 않을 때 (보류중인 데이터를 유지하고 싶지 않은) 구현입니다.
LinkedBlockingQueue
( LinkedList
구현하지만 정확하게 JDK 구현 LinkedList
은 정적 내부 클래스 노드를 사용하여 요소 간의 링크를 유지합니다)
LinkedBlockingQueue의 생성자
public LinkedBlockingQueue(int capacity)
{
if (capacity < = 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node< E >(null); // Maintains a underlying linkedlist. ( Use when size is not known )
}
링크를 유지하는 데 사용되는 노드 클래스
static class Node<E> {
E item;
Node<E> next;
Node(E x) { item = x; }
}
삼 . ArrayBlockingQueue (배열 구현)
ArrayBlockingQueue의 생성자
public ArrayBlockingQueue(int capacity, boolean fair)
{
if (capacity < = 0)
throw new IllegalArgumentException();
this.items = new Object[capacity]; // Maintains a underlying array
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
IMHO 가장 큰 생성자 ArrayBlockingQueue
와의 차이점 LinkedBlockingQueue
은 생성자 하나가 기본 데이터 구조 Array 및 기타 linkedList를 가지고 있다는 것 입니다.
ArrayBlockingQueue
사용 단일 이중 잠금 상태 알고리즘 및 LinkedBlockingQueue
은 "두 로크 큐"알고리즘의 변형이며 2 잠금 2 조건 (takeLock, putLock)이