同步块内的IllegalMonitorStateException

时间:2014-01-01 15:47:52

标签: java multithreading runtime-error illegalmonitorstateexcep

虽然我已经在synchronized块中写了等待。我得到了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();
        }
    }
}

1 个答案:

答案 0 :(得分:6)

这些是你的代码有些问题:

  • 您在notify()之外致电synchronized (this)(这是您的直接问题);
  • 你没有使用正确的 wait-loop 习惯用法,因此面对虚假唤醒错过的通知会冒着不确定行为/死锁的风险>
  • 您在wait-notify个实例上使用Thread机制,recommended against in its documentation;
  • 您扩展Thread,而不是按原样使用该类,只传递Runnable实施的实例。

现在差不多整整十年了,一般的建议是完全避免使用wait-notify机制,而是使用java.util.concurrent中的同步辅助工具之一,例如CountDownLatch