`
san_yun
  • 浏览: 2652011 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

SynchronousQueue

 
阅读更多

SynchronousQueue

一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在;除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的 是尝试添加到队列中的首个已排队线程元素;如果没有已排队线程,则不添加元素并且头为 null。对于其他 Collection 方法(例如 contains),SynchronousQueue 作为一个空集合。此队列不允许 null 元素。

同步队列类似于 CSP 和 Ada 中使用的 rendezvous 信道。它非常适合于传递性设计,在这种设计中,在一个线程中运行的对象要将某些信息、事件或任务传递给在另一个线程中运行的对象,它就必须与该对象同步。

对于正在等待的生产者和使用者线程而言,此类支持可选的公平排序策略。默认情况下不保证这种排序。但是,使用公平设置为 true 所构造的队列可保证线程以 FIFO 的顺序进行访问。公平通常会降低吞吐量,但是可以减小可变性并避免得不到服务。

 

SynchronousQueue<String> queue = new SynchronousQueue<String>();
queue.put("test"); //put will block current thread
System.out.println(queue.take());

 

"main" prio=10 tid=0x0000000040bd3800 nid=0xe75 waiting on condition [0x00007f2763cd8000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000e16e3588> (a java.util.concurrent.SynchronousQueue$TransferStack)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
	at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:422)
	at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323)
	at java.util.concurrent.SynchronousQueue.put(SynchronousQueue.java:810)

 

 

LinkedBlockingQueue

一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。

可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。

 

ArrayBlockingQueue

一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。

这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致放入操作受阻塞;试图从空队列中检索元素将导致类似阻塞。

此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。

 

分享到:
评论

相关推荐

    java 同步器SynchronousQueue详解及实例

    Java 同步器 SynchronousQueue 详解及实例 Java 中的同步器 SynchronousQueue 是一种特殊的阻塞队列,它最多只能放一个元素,这个元素如果不在特定的时间消费掉就会被删除,队列的长度始终为 0。SynchronousQueue ...

    SynchronousQueue实现原理.pdf

    SynchronousQueue是Java中的一个阻塞队列实现,它在Java并发编程中扮演着重要的角色。SynchronousQueue特别之处在于它没有进行数据存储的能力,也就是说它的容量为0。其核心功能是用于线程之间的直接传递数据,实现...

    SynchronousQueue核心属性和方法源码的分析

    SynchronousQueue核心属性和方法源码的分析的代码

    SynchronousQueue详解

    与Exchanger相比,SynchronousQueue同样允许两个线程间交换数据,但Exchanger是在两个线程交换数据后才继续执行,而SynchronousQueue则是实时交换,一旦一个线程完成其操作,另一个线程立即接手。 SynchronousQueue...

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

    同步队列 SynchronousQueue,阻塞双端队列 BlockingDeque, 链阻塞双端队列 LinkedBlockingDeque,并发 Map(映射) ConcurrentMap, 并发导航映射 ConcurrentNavigableMap,交换机 Exchanger, 信号量 Semaphore,执行器...

    Android开发经验谈:并发编程(线程与线程池)(推荐)

    Android开发经验谈:并发编程(线程与线程池) Android开发中,线程和线程池是两个非常重要的概念。...* ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等队列的使用方法

    阿里各岗位技术面试题含答案最新.docx

    SynchronousQueue 是一个特殊的 BlockingQueue,它不存储任何元素,所有的插入操作必须等到其他线程进行相应的删除操作才能完成。在给定的代码中,试图向空的 SynchronousQueue 添加三个元素(1, 2, 3)并尝试取出...

    2004_DISC_dual_DS.pdf

    标题《2004_DISC_dual_DS.pdf》和描述“SynchronousQueue 底层算法相关实现论文”暗示了文档与Java并发编程中的非阻塞同步队列实现及其底层算法相关。从提供的部分内容,我们可以看出,文档讨论了线性化的经典理论...

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

    7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. ...

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

    同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航 映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. ...

    java线程大总结[汇编].pdf

    `ArrayBlockingQueue`、`DelayQueue`、`LinkedBlockingQueue`、`PriorityBlockingQueue`和`SynchronousQueue`都是`BlockingQueue`的不同实现,每种实现都有其特定的特性,比如`ArrayBlockingQueue`是基于数组的,而`...

    Thread基础知识点笔记总结

    SynchronousQueue 是一个同步队列,不存储信息,消费一个才生产下一个。非公平锁,每次‘AAA’线程 put 一个信息,只有当‘BBB’线程 take 后‘AAA’线程才能继续下一次的 put 操作。 11. 传统生产者消费者问题 ...

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

    java.util.concurrent包提供了多种BlockingQueue的实现,包括ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue和SynchronousQueue。每个实现都有其特定的用例和特性,例如...

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

    7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. ...

    day19_阻塞队列、线程池、File类、递归.pdf

    3. **SynchronousQueue**:一个特殊的阻塞队列,它不存储元素,每个put操作必须等待一个take操作,反之亦然。SynchronousQueue提供了公平锁和非公平锁的选项,适用于需要精确控制线程间通信的场景。 以下是一些常用...

    阿里各岗位技术面试题含答案最新.pdf

    SynchronousQueue 是 Java 中的一个特殊类型的 BlockingQueue,它不存储元素,而是充当生产者和消费者之间的同步点。当一个线程调用 offer 方法尝试放入元素时,如果没有其他线程正在调用 take 方法,那么该操作会...

    Java并发大神Doug Lee同步队列论文

    论文中详细介绍了这两种同步队列的设计原理、实现细节以及性能评估,并将其与Java SE 5.0中的`SynchronousQueue`类进行了对比。 #### 同步队列的重要性 同步队列作为一种特殊类型的队列,它在并发编程中扮演着重要...

    java并发包资源

    7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ConcurrentNavigableMap 12. 闭锁 CountDownLatch 13. ...

    java.util.concurrent 实现线程池队列

    3. **SynchronousQueue**:一个不存储元素的阻塞队列,每个插入操作必须等到另一个删除操作对应接收,适合单生产者单消费者场景。 4. **PriorityBlockingQueue**:支持优先级的无界阻塞队列,按照自然顺序或自定义...

    JAVA集中常用的线程池比较共8页.pdf.zip

    除了这些预定义的工厂方法,还可以直接使用`ThreadPoolExecutor`构造函数,自定义更复杂的配置,例如设置工作队列类型(如`ArrayBlockingQueue`、`LinkedBlockingQueue`或`SynchronousQueue`)和拒绝策略(如`...

Global site tag (gtag.js) - Google Analytics