2011-04-15 18 views
1

因此,我正在編寫一個介紹性的java程序來習慣多線程,但是,我對顯示器有點麻煩。特別是,當我進行素數[0] .notifyAll()調用時,下面的代碼段拋出IllegalMonitorStateException。如何確保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;} 
    } 

我synchronized關鍵字的理解是,它保證你有監視器輸入代碼塊之前,所以通過邏輯我應該有一個notifyAll的()調用的監視器。我是否誤解了Java用於同步的策略,或者我在實現這個方法時是否存在一些錯誤?

回答

0

問題是你已經重新分配了一個新的對象來填充[0]。

synchronized(primes[0]) 

上面的語句已經由素數所引用的對象上同步[0]

primes[0]=0; 

上述聲明已重新分配一個新的對象,以素數[0],而不是一個你自己的鎖/顯示器開啓。

primes[0].notifyAll(); 

最後,你試圖對新對象notifyAll(),而不是你有一個鎖,因此例外。

取決於你想實現什麼,下面可以做你想做的:

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

啊,gotcha。非常感謝。 – Jonathan 2011-04-15 03:35:32

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

我希望你得到空指針異常這裏,爲質數也沒有[0]已被分配。