java - 非法监控状态异常

标签 java multithreading notify illegalmonitorstateexcep

<分区>

是什么导致我在这段代码中得到 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 之间的值调用,可能会返回完全相同的实例,甚至更远)。如果这是由两段不相关的代码完成的,那么就会存在隐藏的交互。这适用于在不相关代码之间共享实例的任何类型。常见的例子有 IntegerStringClass(由静态同步方法使用)和 Thread(在 Sun 的实现中, Thread 恰好被用作join 的锁。

关于java - 非法监控状态异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2051385/

相关文章:

java - 使用 XPath 更改文本内容

java - InetSocketAddress 与 InetAddress

java - TableLayout 中的 TextView 数组

multithreading - 最佳实践 : hasXXX() methods for possible null returning getXXX() methods

java - 等待和通知的代码执行顺序

java - 是否需要在同步块(synchronized block)内使用线程 wait() 和 notify()?

java - 是否可以用三种编程语言编写一个程序?

python - 在 Python 中覆盖 threading.excepthook 的正确方法是什么?

python - 如何在python中获取每个核心的线程数

java - 为什么我的通知方法不能正常工作?