我正在執行一個非常簡單的同步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:這是因爲可能沒有線程在等待? –