阻塞队列总结

阻塞队列总结:

1.LinkedBlockingQueue

LinkedBlockingQueue 的内部是通过单向链表实现的,使用头、尾节点来进行入队和出队操作,也就是入队操作都是对尾节点进行操作,出队操作都是对头节点进行操作 。对头、尾节点的操作分别使用了单独的独占锁从而保证了原子性,所以出队和入队操作是可以同时进行的 。 另外对头 、 尾节点的独占锁都配备了一个条件队列,用来存放被阻塞的线程,并结合入队、出队操作实现了 一个生产消费模型 。
阻塞队列总结

2.ArrayBlockingQueue

ArrayBlockingQueue 通过使用全局独占锁实现了同时只能有一个线程进行入队或者出队操作,这个锁的粒度比较大,有点类似于在方法上添加 synchronized的意思 。 其中 。他offer 和 poll 操作通过简单的加锁进行入队、出队操作,而 put 、 take 操作则使用条件变量实现了,如果队列满则等待,如果队列空则等待,然后分别在出队和入队操作中发送信号**等待线程实现同步。另 外,相比 LinkedBlockingQueue,ArrayBlockingQueue 的 size 操作的结果是精确的 , 因为计算前加了全局锁。
阻塞队列总结

3.SynchronousQueue

SynchronousQueue 队列中没有任何缓存的数据,可以理解为容量为 0。我们可以尝试往队列中加入元素,然后调用 size() 方法发现不管怎么加入都是 0,synchronousQueue 提供两种实现方式,分别是 队列 的方式实现。这两种实现方式中, 是属于非公平的策略,队列 是属于公平策略。不同之处就是现进先出和先进后出的问题。