当我尝试运行以下程序时,在这段代码中第一次调用 notify() 时会出现 IllegalMonitorStateException:
synchronized (c) {
try {
notify();
....
这让我有点不知所措:当对象(c)已经在同步块中时,代码怎么可能不对对象(c)进行锁定,检查相同的锁?
请不要介意过度使用 notify() 和 wait() 看起来有些奇怪。我知道有不同的(更有效的)实现可以执行相同的任务,但现在我正试图弄清楚为什么这个特定的实现不起作用。
完整代码如下:
class J implements Runnable {
public static void main(String[] x) {
Calc calc = new Calc();
J j = new J(calc);
Thread t1 = new Thread(j, "one");
Thread tCalc = new Thread(calc, "Calc");
tCalc.start();
t1.start();
}
Calc c;
public J(Calc c) {
this.c = c;
}
public void run() {
synchronized (c) {
try {
notify();
c.wait();
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName() + ": x = "
+ c.getX());
notify();
}
}
}
class Calc implements Runnable {
private int x;
public int getX() {
return x;
}
public void run() {
synchronized (this) {
for (int x = 1; x <= 11111; x *= (x + x)) {
this.x += x;
try {
notify();
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
}
}
}