왜 이런 일이 생길 수 있습니까?java.lang.IllegalMonitorStateException : (m = null) 모니터를 얻지 못했습니다
java.lang.IllegalMonitorStateException: (m=null) Failed to get monitor for (tIdx=60)
at java.lang.Object.wait(Object.java:474)
at ...
이 간단한 풀 솔루션 유발 코드 :
public Object takeObject() {
Object obj = internalTakeObject();
while (obj == null) {
try {
available.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
obj = internalTakeObject();
}
return obj;
}
private Object internalTakeObject() {
Object obj = null;
synchronized (available) {
if (available.size() > 0) {
obj = available.keySet().iterator().next();
available.remove(obj);
synchronized (taken) {
taken.put(obj, Boolean.valueOf(true));
}
}
}
return obj;
}
public void returnObject(Object obj) {
synchronized (taken) {
taken.remove(obj);
}
synchronized (available) {
if (available.size() < size) {
available.put(obj, Boolean.valueOf(true));
available.notify();
}
}
}
내가 뭔가를 놓치고 것은 모니터 개체를 확실히 null이 아닌,하지만 여전히 우리는 자주이 예외를 얻을 수 있다는 것입니다 ?
편집 : 예외는 available.wait();
행에서 발생합니다.
소스 코드에서 474 행이 무엇인지 알려주실 수 있습니까? – flybywire
예외는 available.wait()에서 발생합니다. 줄이지만 474 줄은 java.lang.Object 클래스에서 온 것입니다. –