2013-08-15 1 views
1

나는 나의 Server 클래스의 Queue를 가지고 :이 스레드는 java의 대기열에있는 두 스레드 공유에서 안전합니까?

public class Server{ 

    Queue<Input> inputQueue; 

    public void start() { 
     inThread = new InThread(inputQueue); 
     outThread = new OutThread(inputQueue); 

     inThread.start(); 
     outThread.start(); 
    } 
} 

inThread inputQueue에 데이터 채우기에 대한 책임 것이며, outputQueue에서 꺼내 데이터에 대한 outThread 것이다 책임. InThreadOutThread이 동시에 실행됩니다. 데이터가 안전하지 않을 가능성이 있습니까? 그렇다면, 나는 약간의 연구를했고, 변수와 동기화 된 방법을 동기화했다. 어느 것을 사용해야합니까? 감사.

답변

0

대기열은 스레드간에 공유되므로 읽기 및 쓰기 메소드를 sunchronizing하지 않으면 스레드로부터 안전하지 않습니다.

당신은 스레드 안전 큐 기성품은 다음 ConcurrentLinkedQueue를 사용을 고려할 수 있습니다 원하는 경우 기존의 접근 방식은 하지 스레드 있지만, 손으로 동기화에 대한 필요성의 정도가 아니다

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

+0

링크를 제공하는 경우 Java 7 javadoc을 사용합니다. –

0

.

java.util.concurrent.ArrayBlockingQueue<E>을 사용할 수 있습니다.

ArrayBlockingQueue<Input>blockingQueue=new ArrayBlockingQueue<>(128, false, inputQueue); 

용량과 차단 한 후 대기하는 것은 공정할지 여부를 지정하는 것과 부울 128 변경 : 그것의 생성자는 하나의 콜렉션에 전달하는, 그래서 당신이 할 수 있습니다.

ConcurrentLinkedQueue도 사용할 수 있습니다. 그것의 생성자는 그냥 :

ConcurrentLinkedQueue<Input> clq=new ConcurrentLinkedQueue<>(inputQueue); 
+0

링크를 제공하는 경우 Java 7 javadoc을 사용합니다. –

0

내가 스레드 풀과 대기열을 감싸고 스레드로부터 안전/테스트 인 ExecutorService를을 사용합니다/당신을 위해 작성되었습니다.

일부 대기열에는 외부 동기화가 필요하지만 ConcurrentLinkedQueue와 같은 스레드 세이프 컬렉션을 사용하면 동기화 할 필요가 없습니다.하지만 그렇게해도 많은 상처를주지는 않습니다.

0

내게 당신의 질문은 standard producer consumer case with Wait and Notify 인 것 같습니다.

자바에서 단지 Google 프로듀서 소비자 예를 들어, 수천 개의 예제를 얻을 수 있습니다. 도움이 될 것입니다.

+0

Java 1.3 이전 버전을 사용하지 않으면 notify/wait를 사용하지 않습니다. Java 1.4+에서 동시성 라이브러리 –

+0

을 사용하는 것은 좋지 않습니다. 또한 링크 전용 답변은 권장하지 않습니다. – hexafraction

관련 문제