当前位置:  开发笔记 > 编程语言 > 正文

为什么notifyAll()在Integer上同步时会引发IllegalMonitorStateException?

如何解决《为什么notifyAll()在Integer上同步时会引发IllegalMonitorStateException?》经验,为你挑选了1个好方法。

为什么这个测试程序导致了java.lang.IllegalMonitorStateException

public class test {
    static Integer foo = new Integer(1);
    public static void main(String[] args) {
        synchronized(foo) {
            foo++;
            foo.notifyAll();
        }
        System.err.println("Success");
    }
}

结果:

Exception in thread "main" java.lang.IllegalMonitorStateException
        at java.lang.Object.notifyAll(Native Method)
        at test.main(test.java:6)

erickson.. 54

您已正确注意到notifyAll必须从同步块调用.

但是,在您的情况下,由于自动装箱,您同步的对象与您调用的对象notifyAll不同.实际上,新的递增foo实例仍然局限于堆栈,并且在wait调用时不可能阻止其他线程.

您可以实现自己的可变计数器,在该计数器上执行同步.根据您的应用程序,您可能还会发现AtomicInteger满足您的需求.



1> erickson..:

您已正确注意到notifyAll必须从同步块调用.

但是,在您的情况下,由于自动装箱,您同步的对象与您调用的对象notifyAll不同.实际上,新的递增foo实例仍然局限于堆栈,并且在wait调用时不可能阻止其他线程.

您可以实现自己的可变计数器,在该计数器上执行同步.根据您的应用程序,您可能还会发现AtomicInteger满足您的需求.


这是Autoboxing/unboxing的众多问题之一.
推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有