2011-04-15 4 views
1

マルチスレッドに慣れるための入門的なJavaプログラムを書いていますが、モニタに少し問題があります。特に、以下のコードセクションでは、primes [0] .notifyAll()を呼び出したときにIllegalMonitorStateExceptionがスローされています。 synchronizedキーワードのJavaコードセクションにモニタがあるようにする方法

Integer[] primes=new Integer[3]; 
    if(primes[0]>0{ 
     { 
     synchronized(primes[0]){ 
      int returning=primes[0]; 
      primes[0]=0; 
      primes[0].notifyAll(); 
      return returning;} 
    } 

私の理解では、それは私がのnotifyAll()の呼び出しのためのモニターを持っていなければならないというロジックによるので、コードブロックに入る前に、あなたがモニターを持っていたことが確実ということでした。私はJavaが同期に使用する戦略を誤解していますか、それとも実装しているところにバグがありますか?

答えて

0

問題は、新しいオブジェクトを素数[0]に再割り当てしたことです。

上記の文は、素数によって参照されるオブジェクト上で同期している
synchronized(primes[0]) 

[0]

primes[0]=0; 

上記の文は、ロックを所有して1、[0]素数に新しいオブジェクトを今しないで再割り当てしました/モニターをオンにします。

primes[0].notifyAll(); 

最後に、ロックされているオブジェクトではなく、新しいオブジェクトに対してnotifyAll()を実行しようとしています。そのため例外です。

あなたが達成しようとしているものに応じて、以下は、あなたがやりたいことがあります。素数は[0]していないと私は期待

Integer[] primes=new Integer[3]; 
if(primes[0]>0) { 
    synchronized(primes[0]) { 
    int returning=primes[0]; 
    primes[0]=0; 
    returning.notifyAll(); 
    return returning; 
    } 
} 
+0

Ahh、gotcha。どうもありがとう。 – Jonathan

0
Integer[] primes=new Integer[3]; 
if(primes[0]>0{ 

あなたは、ここでnullポインタ例外を取得します割り当てられた。

関連する問題