浅谈java阻塞队列实现原理
2014-10-06 13:42
671 查看
阻塞队列它支持 put 和 take 方法。如果试图在空的缓冲区上执行 take 操作,则在某一个项变得可用之前,线程将一直阻塞;如果试图在满的缓冲区上执行 put 操作,则在有空间变得可用之前,线程将一直阻塞。可以使用两个 Condition 实例来做到这一点。
class BoundedBuffer {阻塞队列 满了不能放,空了不能取
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
class BoundedBuffer {阻塞队列 满了不能放,空了不能取
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
相关文章推荐
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析
- 剖析Java中阻塞队列的实现原理及应用场景
- Java 阻塞队列实现原理分析
- java并发编程学习: 阻塞队列 使用 及 实现原理
- Java阻塞队列-BlockingQueue介绍及实现原理
- Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理
- 详解Java阻塞队列(BlockingQueue)的实现原理
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析(还没看,先马)
- Java可阻塞队列的两种实现方式
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
- java 可伸缩阻塞队列实现
- 聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个阻塞队列
- Java阻塞队列线程集控制的实现
- 黑马程序员——Java5中的线程并发库(二)--Semaphore实现信号灯、其他同步函数、可阻塞的队列、同步集合
- Java生产者-消费者模式的阻塞队列实现
- 阻塞队列自定义实现 in Java
- Java可阻塞队列的两种实现方式 (传统wait/notify和jdk1.5以后的lock)
- java之中PriorityQueue实现原理(具有优先级的队列)
- 18-java5阻塞队列实现线程间通信-实现线程间通信方式(3)