- 浏览: 36187 次
- 性别:
- 来自: 杭州
最新评论
-
ykdsg:
我想问下rehash()方法中 // 将lastRun之后的整 ...
并发容器分析(五)--ConcurrentHashMap -
borland:
刚才测试了,性能比LinkedBlockingQueue好50 ...
并发容器分析(四)--ConcurrentLinkedQueue
一、简介
BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞,当容量为空时取元素操作会阻塞。ArrayBlockingQueue是对BlockingQueue的一个数组实现,它使用一把全局的锁并行对queue的读写操作,同时使用两个Condition阻塞容量为空时的取操作和容量满时的写操作。
二、具体实现
ArrayBlockingQueue底层定义如下:
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { // 使用循环数组来实现queue,初始时takeIndex和putIndex均为0 private final E[] items; private transient int takeIndex; private transient int putIndex; private int count; // 用于并发的锁和条件 private final ReentrantLock lock; private final Condition notEmpty; private final Condition notFull; /** * 循环数组 * Circularly increment i. */ final int inc(int i) { return (++i == items.length)? 0 : i; } public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0) throw new IllegalArgumentException(); this.items = (E[]) new Object[capacity]; // 分配锁及该锁上的condition lock = new ReentrantLock(fair); notEmpty = lock.newCondition(); notFull = lock.newCondition(); } ... }
ArrayBlockingQueue的取操作:
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private E extract() { final E[] items = this.items; E x = items[takeIndex]; items[takeIndex] = null; takeIndex = inc(takeIndex); --count; // 激发notFull条件 notFull.signal(); return x; } /** * condition的await的语义如下: * 与condition相关的锁以原子方式释放,并禁用该线程 * 方法返回时,线程必须获得与该condition相关的锁 */ public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { try { // 等待notEmpty的条件 while (count == 0) notEmpty.await(); } catch (InterruptedException ie) { notEmpty.signal(); // propagate to non-interrupted thread throw ie; } E x = extract(); return x; } finally { lock.unlock(); } } ... }
ArrayBlockingQueue的写操作:
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private void insert(E x) { items[putIndex] = x; putIndex = inc(putIndex); ++count; notEmpty.signal(); } public void put(E o) throws InterruptedException { if (o == null) throw new NullPointerException(); final E[] items = this.items; final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { try { // 等待notFull条件 while (count == items.length) notFull.await(); } catch (InterruptedException ie) { notFull.signal(); // propagate to non-interrupted thread throw ie; } insert(o); } finally { lock.unlock(); } } ... }
注意:ArrayBlockingQueue在读写操作上都需要锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式。
发表评论
-
并发容器分析(五)--ConcurrentHashMap
2010-10-13 22:20 2852一、简介 ConcurrentHashMap是Map ... -
并发容器分析(四)--ConcurrentLinkedQueue
2010-10-13 22:20 2349一、简介 ConcurrentLinkedQueue ... -
并发容器分析(三)--LinkedBlockingQueue
2010-10-13 22:19 3271一、简介 LinkedBlockingQueue是B ... -
并发容器分析(一)--CopyOnWriteArrayList
2010-10-13 22:19 8026一、简介 JDK5中添加了新的concurrent包 ... -
JGroups通讯协议(三)--FD_ALL
2009-08-02 21:28 0一、简介 FD协议层用于错误诊断,它们使用心跳检测的 ... -
JGroups通讯协议(二)--PING
2009-08-02 14:12 0一、简介 PING协议 ... -
JGroups通讯协议(一)--UDP
2009-08-02 10:33 0一、简介 UDP是JGroups中默认的通讯协议,它 ... -
JGroups代码分析(二)--协议栈ProtocolStack
2009-07-31 21:11 0一、简介 ProtocolStack是JGroup ... -
JGroups代码分析(一)--编程接口JChannel
2009-07-31 20:19 0一、简介 JGroups是 ... -
netty代码分析(五)--ServerBootstrap
2009-07-23 20:20 0一、简介 ServerBootstrap类封装了服务 ... -
netty代码分析(四)--NioWorker
2009-07-23 19:50 0一、简介 一个NioWorker对象拥有一个独立的线 ... -
netty代码分析(三)--ChannelSink
2009-07-23 19:22 0一、简介 ChannelSink是Downstrea ... -
netty代码分析(二)--ChannelPipeline
2014-10-20 12:45 709一、简介 ChannelPipeline是事件(e ... -
netty代码分析(一)--总体设计
2014-10-20 12:44 592一、简介 Netty3是一个轻量级的NIO框架,它 ... -
Ehcache(二)--Store实现
2009-07-10 15:58 0一、简介 Ehcache中实际的数据存储是由Stor ... -
Ehcache(一)--接口
2009-07-10 15:01 0一、简介 Ehcache是一个从Hibernate ... -
JBoss Cache(四)--Evict策略
2009-07-08 21:47 0一、简介 cache系统在缓存数据达到一定数量后,在 ... -
JBoss Cache(三)--MVCC策略
2009-07-08 15:27 0一、简介 JBoss Cache3.0中加入了MVC ... -
JBoss Cache(二)--核心数据结构
2009-07-08 14:41 0一、简介 在采用command/visitor模式之 ... -
JBoss Cache(一)--总体架构
2009-07-08 14:09 0一、简介 JBoss Cache是一款分布式的缓存, ...
相关推荐
并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解
20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类...
ArrayBlockingQueue源码分析.docx
主要介绍了详细分析Java并发集合ArrayBlockingQueue的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
在并发场景下,常会用到ConcurrentHashMap、ArrayBlockingQueue等线程安全的容器类,虽然牺牲了一些效率,但却得到了安全。 上面提到的线程安全容器都在java.util.concurrent包下,这个包下并发容器不少,今天全部翻...
主要介绍了java并发之ArrayBlockingQueue详细介绍的相关资料,需要的朋友可以参考下
ArrayBlockingQueue源码解析__动力节点共23页.pdf.zip
在前面的的文章,写了一个带有缓冲区的队列,是用JAVA的Lock下的Condition实现的,但是JAVA类中提供了这项功能,是ArrayBlockingQueue, ArrayBlockingQueue是由数组支持的有界阻塞队列,次队列按照FIFO(先进先...
3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 Synchronou sQueue 8. 阻塞双端队列 BlockingDeque 9...
3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. ...
3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. ...
数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链...
高并发下性能最好的队列 无锁,采用CAS比较算法,核心参数(V,E,N) V:要更新的变量 E:预期值 N:新值 只有当V==E时,V=N;否则表示已被更新过,则取消当前操作 阻塞队列 BlockingQueue接口 void put(E e) 将指定元素...
ArrayBlockingQueue是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素
ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。下面通过本文给大家介绍Java concurrency集合之ArrayBlockingQueue的相关知识,感兴趣的朋友一起看看吧
今天小编就为大家分享一篇关于Java源码解析阻塞队列ArrayBlockingQueue常用方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了java中LinkedBlockingQueue与ArrayBlockingQueue的异同,需要的朋友可以参考下