<分区>
是什么导致我在这段代码中得到 IllegalMonitorStateException
synchronized(syncCount){
syncCount--;
syncCount.notify();
}
我有点困惑,因为据我所知,正在运行的线程必须对调用通知的对象进行监控。在我看来,我的代码不会出错,但不知何故确实是这样。
<分区>
是什么导致我在这段代码中得到 IllegalMonitorStateException
synchronized(syncCount){
syncCount--;
syncCount.notify();
}
我有点困惑,因为据我所知,正在运行的线程必须对调用通知的对象进行监控。在我看来,我的代码不会出错,但不知何故确实是这样。
最佳答案
Integer
或类似类型? --
将不可变的 Integer
对象替换为另一个对象。因此,您在与 synchronized
不同的对象上调用 notify
。
你的代码相当于:
Integer syncConunt = Integer.valueOf(5);
[...]
synchronized (syncCount) {
syncCount = Integer.valueOf(syncCount.intValue() + 1);
syncCount.notify();
}
你并不孤单。甚至在 J2SE 5.0 之前,我就已经看到在一本书中发布的示例代码在同步块(synchronized block)中分配了一个引用。通常,将锁定字段标记为 final
是个好主意。
另一个重要的一点是代码在它不“拥有”的对象上同步。 Integer
对象是共享的(Integer.valueOf(int)
如果使用 -128 到 127 之间的值调用,可能会返回完全相同的实例,甚至更远)。如果这是由两段不相关的代码完成的,那么就会存在隐藏的交互。这适用于在不相关代码之间共享实例的任何类型。常见的例子有 Integer
、String
、Class
(由静态同步方法使用)和 Thread
(在 Sun 的实现中, Thread
恰好被用作join
的锁。
关于java - 非法监控状态异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051385/