私は次のように非常に単純な同期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;
}
}