2009-10-16 4 views
1

검토중인 코드가 있습니다 (FindBugs 사용).BlockedQueue에서 동기화

public class MyClass{ 
... 
private BlockedQueue q = new LinkedBlockingQueue<MyData>(1000); 
private static final batchSize = 1000; 

public boolean testMethod(){ 
    boolean done = false; 
    synchronized(q){ 
     if(q.size == batchSize){ 
     q.notify(); 
     done = true; 
     } 
    } 
    return done; 

}

나는이 코드 조각에 FindBugs를 실행하면 해당 불평 -

이 방법은 동기화 에게 클래스의 인스턴스가 자바에서 인 객체를 수행 .util.concurrent 패키지 (또는 그 서브 클래스). 이 클래스의 인스턴스 에는 동시성 제어 메커니즘이 있으며 은 과 구별되고 호환되지 않으며 동기화 된 키워드를 사용합니다. 내가 동기화 된 코드 조각 synchronized(q){을 주석 경우

, 그것은 불평 -

이 방법은 분명히 객체에 대한 잠금을 보유하지 않고의 Object.notify() 또는 Object.notifyAll()를 호출합니다. 는 그것이 FindBugs 유효성 검사를 통과하도록 나는이 방법을 구현하는 것이 어떻게

을 던져지는 예외 : IllegalMonitorStateException가 발생합니다 보유한 잠금 없이() 또는가는 notifyAll()에 통보 호출? 위의 구현은 동시 클래스의 경우 알림에 적합합니까?

감사합니다.

+1

'testMethod()'는 그 자체로 의미가 없습니다. 이 이야기에 더 많은 것이 있어야합니다. 그 대답은 "동기화하지 말고 알림에 전화하지 마세요()"입니다. – ChssPly76

+0

동시 데이터 구조의 크기를 찾는 것이 어쨌든 큰 의미를 갖지는 않습니다. –

+0

ChssPly76, 고맙습니다. testMethod()는 크기를 확인하고 notify()를 호출하는 데 사용되는 것입니다. "tackline", 나는 당신에게 동의합니다. –

답변

2

notify()wait()과 함께 가서해야하지의 notifyAll에/통지/대기 전화 java.util.concurrent 클래스와 함께 사용하십시오.

BlockingQueue는 내부 메커니즘을 사용하여 더 많은 요소를위한 공간이 없으면 put()을 차단하고, 소비 할 요소가없는 경우 poll()에 차단합니다. 당신은 이것에 신경 쓸 필요가 없습니다.

0

첫 번째 오류는 java.util.concurrent 클래스 (예 : BlockingQueue)에서 기본 동기화 컨트롤을 사용하지 않아야한다는 오류입니다.

일반적으로 이것은 사용자가 동기화를 처리하는 좋은 방법입니다. 나는 당신의 문제를 해결할 더 좋은 방법이 있다고 생각한다. 당신이 해결하려고하는 실제 문제는 무엇입니까?

번째 오류는 당신이 (그것을 sychronizing에 의해) 오브젝트의 잠금/모니터를 소유해야한다는 사실에 의해 발생이

+0

해결하기 위해 노력하고있는 문제는 FindBug가 오류를보고하지 않도록하는 것입니다. 이 코드는 동시 클래스와 기본 동기화 간의 결합입니다. 최선의 구현이 무엇인지 알고 싶습니다. 내가 말했듯이, 나는 코드를 "검토"하고 최선의 구현을 검토하고있다. –

+0

나는 당신이 당신의 문제를 잘못된 방식으로 해결하고 있음을 확신합니다. 나는 당신이 해결하고자하는 문제점을 확신하지 못합니다. 완벽한 솔루션을 제공하기 위해 초기 게시물을 편집 할 수 있습니까? – Kevin

0

의 BlockingQueue은 syncronizer 목적 - 상태에 기초하여 쓰레드의 제어 흐름을 조정하고 걸릴 블록 넣어 때문에 큐가 비어 있지 원하는 상태 (입력 할 때까지 이와 같이 생산자/소비자 쓰레드 흐름 제어 또는 가득 차 있지 않음).

또한 동시성 프로그래밍의 우수 사례는 wait 및 notify가 while 루프에 있다고 가정합니다.