2011-04-15 50 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]已被分配。