傻大方


首页 > 潮·科技 > >

阻塞队列(1)java 7 种BlockingQueue介绍( 三 )



按关键词阅读:


每一个put操作必须等待一个take操作 , 否则不能继续添加元素 。 SynchronousQueue可以看成是一个传球手 , 负责把生产者线程处理的数据直接传递给消费者线程 。 队列本身并不存储任何元素 , 非常适合于传递性场景,比如在一个线程中使用的数据 , 传递给另外一个线程使 。
SynchronousQueue 的吞吐量高于 LinkedBlockingQueue 和 ArrayBlockingQueue 。
LinkedTransferQueueLinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列 。 相对于其他阻塞队列LinkedTransferQueue多了tryTransfer和transfer方法 。
transfer方法 。 如果当前有消费者正在等待接收元素(消费者使用take()方法或带时间限制的poll()方法时) , transfer方法可以把生产者传入的元素立刻transfer(传输)给消费者 。 如果没有消费者在等待接收元素 , transfer方法会将元素存放在队列的tail节点 , 并等到该元素被消费者消费了才返回 。
transfer方法的关键代码如下:
Node pred = tryAppend(s, haveData);return awaitMatch(s, pred, e, (how == TIMED), nanos);第一行代码是试图把存放当前元素的s节点作为tail节点 。
第二行代码是让CPU自旋等待消费者消费元素 。 因为自旋会消耗CPU , 所以自旋一定的次数后使用Thread.yield()方法来暂停当前正在执行的线程 , 并执行其他线程 。
tryTransfer方法 。 则是用来试探下生产者传入的元素是否能直接传给消费者 。 如果没有消费者等待接收元素 , 则返回false 。 和transfer方法的区别是tryTransfer方法无论消费者是否接收 , 方法立即返回 。 而transfer方法是必须等到消费者消费了才返回 。
对于带有时间限制的 tryTransfer(E e, long timeout, TimeUnit unit) 方法 , 则是试图把生产者传入的元素直接传给消费者 , 但是如果没有消费者消费该元素则等待指定的时间再返回 , 如果超时还没消费元素 , 则返回false , 如果在超时时间内消费了元素 , 则返回true 。
LinkedBlockingDequeLinkedBlockingDeque是一个由链表结构组成的双向阻塞队列 。 所谓双向队列指的你可以从队列的两端插入和移出元素 。 双端队列因为多了一个操作队列的入口 , 在多线程同时入队时 , 也就减少了一半的竞争 。
相比其他的阻塞队列 , LinkedBlockingDeque多了addFirst , addLast , offerFirst , offerLast , peekFirst , peekLast等方法 , 以First单词结尾的方法 , 表示插入 , 获取(peek)或移除双端队列的第一个元素 。 以Last单词结尾的方法 , 表示插入 , 获取或移除双端队列的最后一个元素 。
另外插入方法add等同于addLast , 移除方法remove等效于removeFirst 。
但是take方法却等同于takeFirst , 不知道是不是Jdk的bug , 使用时还是用带有First和Last后缀的方法更清楚 。
在初始化LinkedBlockingDeque时可以初始化队列的容量 , 用来防止其再扩容时过渡膨胀 。
另外双向阻塞队列可以运用在“工作窃取”模式中 。
阻塞队列的实现原理如果队列是空的 , 消费者会一直等待 , 当生产者添加元素时候 , 消费者是如何知道当前队列有元素的呢?
如果让你来设计阻塞队列你会如何设计 , 让生产者和消费者能够高效率的进行通讯呢?让我们先来看看JDK是如何实现的 。
使用通知模式实现 。
所谓通知模式 , 就是当生产者往满的队列里添加元素时会阻塞住生产者 , 当消费者消费了一个队列中的元素后 , 会通知生产者当前队列可用 。
小结作为 java 开发者 , 每个人都喜欢吹高并发 。
可是高并发就像鬼一样 , 吹得人多 , 见得人少 。
90% 的 java coder 估计连这 7 种阻塞队列都不清楚 , 包括老马本人 。
于是我痛定思痛 , 花了几周的时间 , 将上面 7 个队列的用法和源码学了一遍 , 将在阻塞队列系列分享给大家 。
让高并发见鬼去吧~
希望本文对你有帮助 , 如果有其他想法的话 , 也可以评论区和大家分享哦 。
各位极客的点赞收藏转发 , 是老马持续写作的最大动力!


稿源:(未知)

【傻大方】网址:http://www.shadafang.com/c/111J30XH020.html

标题:阻塞队列(1)java 7 种BlockingQueue介绍( 三 )


上一篇:屏幕上|男子花1000元买报废苹果X, 本以为亏大了, 结果却很意外

下一篇:ARGON18|新款ARGON18全能向公路车上市 更硬更持久