次のプログラムを実行しようとすると、次のコードの notify () への最初の呼び出しで IllegalMonitorStateException が発生します。
synchronized (c) {
try {
notify();
....
これは私を少し混乱させます: 同じロックをチェックする同期ブロックに既にある場合、コードがオブジェクト (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();
}
}
}