質問: new test2(); t1.start(); while(t1.getstate() != thread.state.waiting); t2.start(); が思ったように動いてはいるものの、なぜ正常に動いているかがわかりません。 t1が wait() したときはobj1のロックをもっていて、t2の synchronized (obj1){obj1.notify()} ブロックに入れず待機するはずだと思うのですが。 なぜちゃんと動いているのでしょう?
回答: 直接的な回答は、 「obj1.wait();時にはobj1のロックは解除されるので」 また、そのコードだと、 1. test1:synchronized (obj1) test2:synchronized (obj2) 2. test1:synchronized (obj2) test2:synchronized (obj1) の順に動作した場合にデッドロックを起こす可能性が残っていると思います(再現性が落ちただけ) 多分、volatileな状態を組み合わせるなどしないと回避できないと思います。 # なぜ、スレッド構成での直列化にこだわっているのかの背景を知らない身からすると、 # 無駄に大変な努力をすることになるように感じますので、 # 個人的には、前回スレの回答者のご意見を推奨しておきます。