【发布时间】: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
-
put和take使用不同的锁和条件。结果,他们无法互动。 Meanawile,他们应该。
标签: java locks blockingqueue reentrantlock