我正在实现一个非常简单的同步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;
}
}