我正在为实践编写我自己的BlockingQueue实现。我尽量避免在方法中使用synchronized关键字。相反,我想使用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();
}
}耽误您时间,实在对不起!
发布于 2013-01-19 17:37:20
你可以将你的逻辑与开放的jdk实现的阻塞队列进行比较。
ArrayBlockingQueue
Btw..ArrayBlockingQueue还使用ReentrantLock
https://stackoverflow.com/questions/14412411
复制相似问题