검토중인 코드가 있습니다 (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()에 통보 호출? 위의 구현은 동시 클래스의 경우 알림에 적합합니까?
감사합니다.
'testMethod()'는 그 자체로 의미가 없습니다. 이 이야기에 더 많은 것이 있어야합니다. 그 대답은 "동기화하지 말고 알림에 전화하지 마세요()"입니다. – ChssPly76
동시 데이터 구조의 크기를 찾는 것이 어쨌든 큰 의미를 갖지는 않습니다. –
ChssPly76, 고맙습니다. testMethod()는 크기를 확인하고 notify()를 호출하는 데 사용되는 것입니다. "tackline", 나는 당신에게 동의합니다. –