Why does notifyAll() raise IllegalMonitorStateException when synchronized on Integer?

后端 未结 4 1054
情书的邮戳
情书的邮戳 2020-12-08 09:30

Why does this test program result in a java.lang.IllegalMonitorStateException?

public class test {
    static Integer foo = new Integer(1);
             


        
4条回答
  •  南笙
    南笙 (楼主)
    2020-12-08 10:08

    You have noted correctly that notifyAll must be called from a synchronized block.

    However, in your case, because of auto-boxing, the object you synchronized on is not the same instance that you invoked notifyAll on. In fact, the new, incremented foo instance is still confined to the stack, and no other threads could possibly be blocked on a wait call.

    You could implement your own, mutable counter on which synchronization is performed. Depending on your application, you might also find that AtomicInteger meets your needs.

提交回复
热议问题