在Java类中的同步方法中没有遵守互斥锁

时间:2010-01-26 10:02:36

标签: java multithreading mutex

我在加载我的Queue类时遇到了互斥问题,我不知道为什么会发生这些问题。

objects = new ArrayList<Object>();
public synchronized int getSize(){
 return objects.size();
}

public synchronized Object dequeue(){
 if(getSize()==0){
  try {
   wait();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 return objects.remove(0);
}

public synchronized void enqueue(Object o){
 objects.add(o);
 notify();
}

似乎一段时间后出列的dequeue方法导致了Java.lang.IndexOutOfBoundsException,对我来说,看起来线程已经能够多次调用dequeue方法了。任何想法???

w ^

2 个答案:

答案 0 :(得分:1)

wait()可以在没有另一个调用notify()的线程的情况下返回,这可以解释您所看到的异常。

尝试

while(getSize()==0)

notifyAll();

而不是

if(getSize()==0)

notify();

答案 1 :(得分:0)

当多个线程在dequeue方法中等待并唤醒或获得InterruptedException(由于除了notify之外的其他原因),即使它是空的,它们也会尝试从队列中获取一个对象。

如果您将方法更改为:

public synchronized Object dequeue(){
 while (getSize()==0){
  try {
   wait();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 return objects.remove(0);
}

问题应该消失,作为奖励,您可以使用notifyAll()而不是依赖于通知的行为。