SynchronousQueue
SynchronousQueue (동기 큐)
각 삽입 연산이 다른 쓰레드의 대응하는 제거 연산을 기다려야 하고, 그 반대도 마찬가지인 블로킹 큐예요. 내부 용량이 전혀 없어서 요소가 한 개도 담기지 않아요. 프로듀서가 소비자에게 바로 전달하는 핸드오프 설계에 잘 맞아요.
본문
동기 큐는 내부 용량이 없어요. 심지어 용량 1조차 없어요. 그래서 다음과 같은 성질을 가져요.
- 요소를 제거하려고 시도할 때만 요소가 존재하므로
peek을 할 수 없어요. - 다른 쓰레드가 제거하려 하지 않으면 어떤 메서드로도 요소를 삽입할 수 없어요.
- 순회할 것이 없으므로
iterate도 할 수 없어요. - 큐의 머리는 가장 먼저 대기 중인 삽입 쓰레드가 추가하려는 요소예요. 그런 쓰레드가 없다면 제거 가능한 요소가 없으므로
poll()은null을 반환해요. contains같은 다른Collection메서드 관점에서는 빈 컬렉션처럼 동작해요.- null 요소는 허용하지 않아요.
동기 큐는 CSP와 Ada에서 사용되는 랑데부 채널과 비슷해요. 한 쓰레드에서 실행되는 객체가 다른 쓰레드에서 실행되는 객체와 동기화되어 정보·이벤트·작업을 넘겨주는 핸드오프 설계에 잘 어울려요.
이 클래스는 대기 중인 프로듀서와 컨슈머 쓰레드의 순서를 위한 선택적 공정성 정책을 지원해요. 기본적으로 순서는 보장되지 않지만, fair 설정을 true로 하면 FIFO 순서로 접근권을 부여해요.
SynchronousQueue<String> queue = new SynchronousQueue<>(true); // fair
이 클래스와 그 iterator는 Collection과 Iterator 인터페이스의 모든 선택적 메서드를 구현해요. Java Collections Framework의 구성원이에요. 코드와 시그니처는 원문 그대로 보존돼요.