1

많은 제작자 (적어도 2 명)가 고정 된 비율로 동일한 LinkedBlockingQueue에 액세스하는 Java 상황을 모델링하려고합니다. 그들은 다시 생산하고, 다시 시작합니다. 이것이 결국 큐에서 쓰기 액세스를 얻으려는 프로듀서 간의 경쟁 조건으로 이어질 수 있는지 궁금합니다. java.util.concurrent.BlockingQueue의 구현물이 이미 그러한 문제를 처리하도록 설정되어 있습니까? 아니면 이런 종류의 문제를 피하기 위해 수동으로 뮤텍스를 작성해야합니까?생산자 - 소비자 시나리오에서 많은 제작자와 LinkedBlockingQueue 스레드 안전성

감사합니다.

+2

모든 BlockingQueues는 스레드로부터 안전합니다. – assylias

+1

"BlockingQueue는 여러 생성자 및 여러 소비자와 안전하게 사용할 수 있습니다." http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html – Fildor

답변

1

자바의 블로킹 큐는 걸릴 같은 단일 작업에 대한 스레드 안전 넣어하지만 여러 작업 넣어의 또는 원자 적으로 수행되고 있지 않은 오퍼레이션과 addAll 등의 작업을 위해 수 없습니다.

그렇다면 대답은 '아니오'입니다. 생산자가 여러 제품을 만들어 한꺼번에 처리하도록하지 않으려면 스레드 안전을 직접 처리하면 안됩니다.

+0

답장을 보내 주셔서 감사합니다. 단일 작업을 위해 차단 대기열에 액세스 할 때 기아 회피 메커니즘도 기본적으로 제공됩니까? – pr0gma

+1

귀하의 경우 도움이되지 않을 수 있지만 ArrayBlockingQueue 생성자에서 설정할 수있는 공평 플래그가 있습니다. 이는 블로킹 동작이 기아를 방지 할 수있는 FIFO 순서로 서비스되도록 보장합니다. – brettw