2017-05-24 3 views
0
void waitForSignal() { 
    Object obj = new Object(); 
    synchronized(Thread.currentThread()) { 
     obj.wait(); 
     obj.notify(); 
    } 

} 

InterruptedExceptionがスローされることがあることは知っていますが、それには他の問題がありますか?デッドロックなど...Javaの次のコードでwait()とnotify()の何が問題になっていますか?

+3

どのように起きるでしょうか? – ruakh

+5

'obj'で同期していないので、' IllegalMonitorStateException'がスローされます。 – shmosel

+0

現在のスレッドで同期するのは完全に無意味です。あなた自身を守っている唯一の糸はあなたのものです。 *オブジェクト*を同期させる必要があります。 – EJP

答えて

0
  1. それを扱う場合
  2. が処理されない例外:InterruptedExceptionのためのコメントで述べたように、それはjava.lang.IllegalMonitorStateExceptionがスローされますコンパイルされません。
  3. はいデッドロックの問題があります。 このメソッドの中に新しいオブジェクトを作成し、同じオブジェクトを待つたびに、他のスレッドが同じobjインスタンスを持たないため、待ち状態にはならず、したがって通知できなくなります。
+0

'obj'が' waitForSignal() 'メソッドの外側にあり、' synchronized(Thread.currentThread()) 'が' synchronized(obj) 'に設定されていても、スレッドごとにデッドロックが発生しますか? ? –

+0

はい、デッドロックが再び発生します。 実際にあなたのコードは、それが待たずに出るまで正しく動作しません。他のスレッドは、obj.waitを呼び出すスレッドが同じものを取得しているので、objロックが不可能な場合にのみnotifyを呼び出すことができます –

関連する問題