java阻塞队列SynchronousQueue

综述

再线程池的源码分析中我们经常对比两个线程池的实现 newCacheThreadPool和newFixedThreadPool

由下图我们可以知道newcacheTreadPool 应用SynchronousQueue。这个线程池适用于执行大量的短时任务。而应用SynchronousQueue作用是把某个线程中的一个对象,安全的交付给另外一个线程。
在这里插入图片描述
SynchronousQueue 也是一个队列来的,他和linkBlockQueue 一样继承线程安全的阻塞队列。**这样一种阻塞队列,其中每个 put 必须等待一个take,反之亦然,**同步队列中没有任何内部容量,甚至连一个队列容量都没有。
此队列不支持peek方法。因为仅在试图要取得元素时,该元素才存在;
并且:除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头是尝试添加到队列中的首个已排队线程元素; 如果没有已排队线程,则不添加元素并且头为 null。

具体生产消费模型可以简单理解为:一个生产线程,当它生产产品(即put的时候),如果当前没有人想要消费产品(即当前没有线程执行take),此生产线程必须阻塞,等待一个消费线程调用take操作,take操作将会唤醒该生产线程,同时消费线程会获取生产线程的产品(即数据传递),这样的一个过程称为一次配对过程(当然也可以先take后put,原理是一样的)。

使用示类为参考 newcacheTreadPool的应用。

实现原理

synchronousQueue 不像ArrayBlockingQueue、LinkedBlockingDeque之类的阻塞对垒依赖实现并发操作。SynchronousQueue直接使用CAS 实现线程的安全访问。具体实现原理 todo