java.lang.IllegalMonitorStateException: (m=null) Failed to get monitor for
java.lang.IllegalMonitorStateException: (m=null) Failed to get monitor for
为什么会发生这种情况?问题是监视器对象肯定不是空的,但我们经常遇到这个异常:
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();
一行。