2013-01-19 60 views
3

我正在編寫自己的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(); 
    } 
} 

謝謝你的時間!

+1

我認爲最好的辦法是閱讀JDK源。你的代碼真的有用嗎?我看到很多newCondition()然後等待。條件的ptr沒有保存,因此無法喚醒它們。 – farmer1992

+0

我明白你的觀點。當然,我需要先保存條件,然後調用await()和signal()。 – Hir

+0

你應該首先檢查代碼是否按照承諾正確工作。檢查所有併發流量。然後,如果你發現它沒有執行,你可以更改代碼。 –

回答

1

你可以將你的邏輯與開放的jdk實現的Blocking隊列進行比較。

ArrayBlockingQueue

Btw..ArrayBlockingQueue還採用的ReentrantLock

+0

是的,我看了jdk中LinkedBlockingQueue的實現,並寫了上面的代碼。 – Hir

+0

@NPE感謝您的建議。我在codereview.stackexchange.com上問了我的問題 – Hir