我在加载我的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 ^
答案 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()
而不是依赖于通知的行为。