【问题标题】:BlockingQueue Implemetation using ReentrantLock使用 ReentrantLock 实现 BlockingQueue
【发布时间】:2013-01-02 23:01:44
【问题描述】:

我正在编写自己的 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() 然后等待。条件的指针没有保存,因此无法唤醒它们。
  • 我明白你的意思。当然我需要先保存条件,然后调用 await() 和 signal() 就可以了。
  • 您应该首先检查代码是否按照承诺正常工作。检查所有并发流。然后,如果您发现它没有执行,您可以更改代码。
  • 你的问题,就目前而言,更适合codereview.stackexchange.com
  • puttake 使用不同的锁和条件。结果,他们无法互动。 Meanawile,他们应该。

标签: java locks blockingqueue reentrantlock


【解决方案1】:

您可以将您的逻辑与阻塞队列的开放 jdk 实现进行比较。

ArrayBlockingQueue

Btw..ArrayBlockingQueue 也使用 ReentrantLock

【讨论】:

  • 是的,我在 jdk 中查看了 LinkedBlockingQueue 的实现并写了上面的代码。
  • @NPE 感谢您的建议。我在 codereview.stackexchange.com 上问了我的问题
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多