私はJavaマルチスレッドに取り組んでいます。私は C/C++ pthreads に精通していますが、Javanotify()
とwait()
関数に問題があります。
IllegalMoinitorStateException
「所有」していない(同期していない)スレッドが通知/待機を呼び出した場合にのみスローされることを理解しています。
アプリケーションを作成しているときに、この問題に遭遇しました。次のテスト コードで問題を切り分けました。
public class HelloWorld
{
public static Integer notifier = 0;
public static void main(String[] args){
notifier = 100;
Thread thread = new Thread(new Runnable(){
public void run(){
synchronized (notifier){
System.out.println("Notifier is: " + notifier + " waiting");
try{
notifier.wait();
System.out.println("Awake, notifier is " + notifier);
}
catch (InterruptedException e){e.printStackTrace();}
}
}});
thread.start();
try{
Thread.sleep(1000);
}
catch (InterruptedException e){
e.printStackTrace();
}
synchronized (notifier){
notifier = 50;
System.out.println("Notifier is: " + notifier + " notifying");
notifier.notify();
}
}
}
これは以下を出力します:
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at HelloWorld.main(HelloWorld.java:27)
通知オブジェクトのロックを既に取得していると思います。私は何を間違っていますか?
ありがとう!
編集:
この可能な重複 (整数値での同期) から、同じインスタンスで同期していることを確認するのが難しいため、整数で同期することはお勧めできません。同期している整数はグローバル可視静的整数であるため、異なるインスタンスを取得するのはなぜですか?