为什么会发生这种情况?问题是,监测对象是不是null肯定的,但我们仍然可以得到这个异常往往: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();
}
}
}
我缺少的东西?
编辑:异常发生在available.wait();
行。
你能告诉我们源代码中的474行是什么吗? – flybywire 2009-10-12 10:52:54
异常发生在available.wait();行,但第474行来自java.lang.Object类。 – 2009-10-12 10:55:59