我正在执行一个非常简单的同步Circular Queue
,因为它的后面,我的一个朋友说,它很容易deadlock
!但我不这么认为,同步循环队列
实际上,当一个线程想要出队(轮询)如果队列是空的,它必须等到另一个线程入队(提供)一个元素,反之亦然,如果队列已满,
我不是很擅长寻找死锁代码,你认为它也容易出现死锁吗?
import java.util.ArrayList;
class CircularQueue<T>{
ArrayList<T> q;
int front , rear , size;
public CircularQueue(int size){
q = new ArrayList<T>();
for (int i = 0 ; i < size ; i++)
q.add(null);
front = 0;
rear =0;
this.size = size;
}
public void offer(T t) throws InterruptedException{
synchronized(this){
if ((rear + 1) % size == front)
this.wait();
}
rear = (rear + 1) % size;
q.set(rear, t);
this.notify();
}
public T poll() throws InterruptedException{
synchronized(this){
if (rear == front)
this.wait();
}
front = (front+1) % size;
T result = q.get(front);
this.notify();
return result;
}
}
'this.notify()'总会抛出'IllegalMonitorStateException',因为它是不同步的 –
也许我失去了一些东西,但是这不就是完全一样的[界的BlockingQueue(HTTP://文档。 oracle.com/javase/6/docs/api/java/util/concurrent/ArrayBlockingQueue.html)? 您的实现不同步导致意外行为。例如,两个线程可能会同时更改'poll()'方法中的'front'。 – nif
@Adam Siemion:这是因为可能没有线程在等待? –