我正在編寫自己的BlockingQueue實現。我試圖避免使用方法的synchronized關鍵字。我反而喜歡使用ReentrantLock。BlockingQueue使用ReentrantLock實現
寫這個實現的最好方法是什麼?我不是Java忍者,如果有人能夠在我的代碼中找出錯誤並提出更好的實現方法,我會非常感激。
public class MyBlockingQueue<T> {
private Queue<T> queue;
private AtomicInteger limit = new AtomicInteger(10);
private Lock put_lock = new ReentrantLock();
private Lock take_lock = new ReentrantLock();
private Condition put_condition = put_lock.newCondition();
private Condition take_condition = take_lock.newCondition();
public MyBlockingQueue(AtomicInteger limit){
queue = new LinkedList<T>();
this.limit = limit;
}
public boolean put(T item) throws InterruptedException{
put_lock.lockInterruptibly();
try {
while(queue.size() == limit.get()) {
put_condition.await();
}
put_condition.signal();
queue.add(item);
} finally{
put_lock.unlock();
}
return true;
}
public T take() throws InterruptedException{
take_lock.lockInterruptibly();
try {
while (queue.size() == 0) {
take_condition.await();
}
take_condition.signal();
return queue.poll();
} finally {
take_lock.unlock();
}
}
謝謝你的時間!
我認爲最好的辦法是閱讀JDK源。你的代碼真的有用嗎?我看到很多newCondition()然後等待。條件的ptr沒有保存,因此無法喚醒它們。 – farmer1992
我明白你的觀點。當然,我需要先保存條件,然後調用await()和signal()。 – Hir
你應該首先檢查代碼是否按照承諾正確工作。檢查所有併發流量。然後,如果你發現它沒有執行,你可以更改代碼。 –