2012-03-01 2 views
0

버퍼를 사용하여 스레드간에 객체를 전달하는 Java 응용 프로그램을 사용하고 있습니다. 일반적으로 BufferUtils를 사용하여 이러한 버퍼를 동기화합니다. 버퍼에 객체를 추가하는 단 하나의 스레드 만 있고 버퍼에서 객체를 제거하는 단 하나의 다른 스레드 만 제거하면됩니다. 그들 사이의 버퍼가 동기화되어야합니까?하나의 스레드 만 추가하고 하나의 (다른) 스레드 만 제거하는 경우 버퍼를 동기화해야합니까?

문제의 두 스레드가 스프링 빈에서 인스턴스화되고 두 버퍼가 참조하는 버퍼에 대해 세 번째 빈을 갖는 경우에만 공유 버퍼를 사용할 수있는 경우가 있습니다. 나는 빈에서 동기화 된 버퍼를 만드는 방법을 알아 내지 못했고, 따라서 그것이 필요한지 아닌지에 관한 질문을 던졌다.

답변

1

아마도 BlockingQueue를 사용하여 해당 객체를 전달할 수 있습니다. 블로킹 큐는 스레드로부터 안전합니다. 또한 여러 가지 put/get 변종을 제공하여 멋지게 사용할 수 있습니다. put 메서드는 대기열에 충분한 공간이 생길 때까지 스레드를 차단합니다. Offer 메서드는 제한 시간과 함께 사용할 수 있으므로 큐에 추가 할 수 없으면 false를 반환합니다.

당신은 BlockingQueue

+0

이 내가 필요 정확히 무엇을했다, 감사합니다. 게다가, 그것은 객체를 추가하는 타임 아웃을위한 아주 좋은 메소드를 가지고 있습니다. BufferOverflow를 잡는 대신에 add에 부울 리턴이 있습니다. 정말 좋은, 감사합니다! – tdimmig

+0

이것은 거의 두 번째 질문이지만 완전히 새로운 소식을 올릴 가치가 없습니다. 성능면에서 BlockingQueue가 BufferUtils와 동기화 된 버퍼와 어떻게 비교되는지 알고 있습니까? – tdimmig

+0

(아주) 늦게 답장을 드려 죄송합니다. 확실히 알기 위해서는 몇 가지 테스트를 실행해야합니다. BlingQueue 변종은 잘 쓰여지고 효율적이라는 믿음이 있습니다. Java 5에서 추가 된 동시 패키지의 일부입니다. 잘못 입력하지 않은 경우입니다. 그러나 결국, 당신이 사용하는 방법이 당신에게 어울리는 지 알아보기 위해 몇 가지 검사를 실시하고 측정을해야합니다. 사용 가능한 클래스를보고 Array 백 또는 LinkedList 백 큐에서 선택할 수 있습니다. 자세한 내용은 위의 문서를 참조하십시오. 건배, 티 베리 우 –

1

예 버퍼가 동기화 될 필요가있을 것이다 그것을 확인할 수 있습니다. Java 메모리 모델에 의하면, 복수의 thread가 동기하지 않고 같은 데이터 구조에 액세스하고있는 경우, 어느 thread에 의한 변경이 다른 thread에 대해서 보여지는 것은 아닙니다. 어떤 형태의 BlockingQueue가 트릭을해야합니다.

관련 문제