1

虽然我已经在同步块中写了等待。我越来越IllegalMonitorStateException。那是什么原因呢?

package trials;

public class WaitNotifyTrial {

    public static void main(String[] args){
        Generator g=new Generator();
        g.start();
        System.out.println("Start");
        synchronized (g) {
                try {
                    g.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    System.out.println("Printing exception");
                    e.printStackTrace();
                }
                System.out.println(g.value);
        }
    }
}

class Generator extends Thread{

    int value;

    public void run(){
        synchronized (this) {
            value=10;
        }
        notify();
        }
    }
}
4

1 回答 1

6

这些是您的代码的一些问题:

  • 你打电话给notify()外面synchronized (this)(这是你的直接问题);
  • 您没有使用正确的等待循环习语,从而在面对虚假唤醒错过通知时冒着不确定的行为/死锁的风险;
  • 您在实例上使用该wait-notify机制,在其文档中建议不要这样做Thread
  • 您扩展Thread而不是按原样使用该类,并且仅将Runnable.

近十年来,一般的建议是wait-notify完全避免这种机制,而是使用来自 的同步辅助工具之一java.util.concurrent,例如CountDownLatch.

于 2014-01-01T16:19:51.057 回答