`

LinkedBlockingDeque 源码分析

阅读更多
简介:

LinkedBlockingDeque 是一个双端队列,在队列的两头都能进行 put/offer 操作.我感觉这个类很鸡肋,效率不是很高,大而全.


实现原理:

LinkedBlockingDeque 底层使用一把锁(ReentrantLock)来控制入队出队操作.也就是说队列两头的操作来抢这一把锁. 所以这是我认为效率低下的原因.


使用场景:

LinkedBlockingDeque 使用在工作窃取模式下.
工作窃取模式:比如说有两个工人A和B,A和B关系很好,老板给A和B分配了任务. 由于A的任务复杂度较低,先做完了,B 还在做. 因为A和B是好哥们,A说,哥们,你从前面往后做,我(A)从后面王前做,就这样,A和B一起把任务做完了.


和 LinkedBlockingQueue 对比:

1.LinkedBlockingQueue 使用两把锁来控制 take/put 操作,而 LinkedBlockingDeque 使用一把锁来控制,这是 LinkedBlockingDeque 效率低下原因之一.
2.LinkedBlockingQueue 只会在合适的条件下才会通知其他线程我没满/我没空,但是 LinkedBlockingDeque 会在每次执行 take/put 操作的时候都会通知其他线程我没满/我没空,这是 LinkedBlockingDeque 效率低下原因之二.


问题:

1.为啥 LinkedBlockingDeque 不使用两把锁来控制 take/put 了?就像 LinkedBlockingQueue 实现那样.

0
0
分享到:
评论

相关推荐

    Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    Java concurrency之LinkedBlockingDeque详解 LinkedBlockingDeque是Java concurrency包中的一个重要类,它是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时...

    javabitset源码-JerrySoundCode:杰瑞声码

    bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet ...

    JavaInterview:最开源的Java技术知识点,以及Java源码分析。为开源贡献自己的一份力

    LinkedBlockingDeque :scroll: 主要介绍LeetCode上面的算法译文,以及面试过程中遇到的实际编码问题总结。 :locked: :file_folder: :laptop: :globe_showing_Asia-Australia: :floppy_disk: :input_latin_...

    java++小型游戏项目(文档与源代码).可用做毕业设计

    6. **文档编写**:项目附带的“详细文档”可能包括需求分析、系统设计、程序流程图等,这有助于学习者学习如何撰写专业的技术文档,提高软件工程素养。 7. **版本控制**:虽然未明确提及,但一个完整的项目通常会...

    汪文君高并发编程实战视频资源全集

     高并发编程第三阶段11讲 AtomicXXXFieldUpdater源码分析及使用场景分析.mp4  高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4  高并发编程第三阶段13讲 一个JNI程序的编写,通过...

    汪文君高并发编程实战视频资源下载.txt

     高并发编程第三阶段11讲 AtomicXXXFieldUpdater源码分析及使用场景分析.mp4  高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4  高并发编程第三阶段13讲 一个JNI程序的编写,通过...

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    链阻塞双端队列 LinkedBlockingDeque,并发 Map(映射) ConcurrentMap, 并发导航映射 ConcurrentNavigableMap,交换机 Exchanger, 信号量 Semaphore,执行器服务 ExecutorService, 线程池执行者 ThreadPoolExecutor,...

    java 线程池实现多并发队列后进先出

    在Java中,可以使用`java.util.Deque`接口的实现,例如`java.util.concurrent.LinkedBlockingDeque`,它支持双端插入和删除,可以作为线程池的工作队列。 - 在创建`ThreadPoolExecutor`时,可以通过传递`...

    java并发工具包详解

    9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore ...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore ...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航 映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore ...

    JAVA高并发_学习笔记

    JAVA学习高并发的学习笔记。...BlockingQueue:ArrayBlockingQueue , DelayQueue , LinkedBlockingDeque , LinkedBlockingQueue , LinkedTransferQueue , PriorityBlockingQueue , SynchronousQueue

    java线程大总结.pdf

    在给出的示例中,创建了一个`LinkedBlockingDeque`实例,并尝试向其中添加30个元素,结果同样会因栈满而阻塞。 这些同步机制对于构建高效的并发应用程序至关重要,它们可以帮助避免死锁、减少不必要的线程上下文...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore ...

    java并发包资源

    9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. 栅栏 CyclicBarrier 14. 交换机 Exchanger 15. 信号量 Semaphore ...

    LRU算法.zip

    1. 数据结构:LRU Cache 的实现,可能使用了HashMap(用于快速查找)和Deque(如LinkedBlockingDeque或LinkedList,用于保持顺序)相结合的方式。 2. 插入操作:当有新数据插入时,首先检查LRU缓存是否已满。若已满...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    ### 10、阻塞队列BlockingQueue 实战及其原理分析 #### 一、阻塞队列概述 阻塞队列(BlockingQueue)是Java语言中`java.util.concurrent`包下提供的一种重要的线程安全队列。它继承自`Queue`接口,并在此基础上...

    线程经典问题代码

    通过查看源码,我们可以深入理解如何实现生产者-消费者模型,包括线程间的同步和通信,以及如何避免常见的并发问题,如死锁、活锁和饥饿等。 总之,生产者-消费者问题是多线程编程中的经典案例,它展示了如何在多个...

    RingBuffer_环形缓冲区_

    例如,Java中的`java.util.concurrent.LinkedBlockingDeque`可以看作是一个环形缓冲区的实现,C++的Boost库提供了`boost::lockfree::ring_buffer`。在实际项目中,根据需求选择合适的库或自定义实现,以优化数据处理...

    java面试题合集

    - **LinkedBlockingDeque**: 双端队列。 - **实现原理**: - 使用`Condition`实现通知机制,以同步队列中的生产者和消费者。 - **非阻塞队列**如`ConcurrentLinkedQueue`使用CAS算法来实现线程安全的操作。 **6. ...

Global site tag (gtag.js) - Google Analytics