当前位置: 代码迷 >> 综合 >> 【多线程】ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue
  详细解决方案

【多线程】ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue

热度:6   发布时间:2023-12-22 23:15:06.0

ArrayBlockingQueue
ArrayBlockingQueue是接口BlockingQueue的阻塞实现队列之一。
基于数组实现的一个阻塞队列,在创建对象时必须制定容量大小。并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列。它能够实现插入和取出的阻塞方法put()和take()方法其实也是通过使用通知模式来实现。查看源码就可以知道ArrayBlockingQueue生产者方放入数据、消费者取出数据都是使用同一把重入锁,这就两者无法真正的实现生产者和消费者的并行。

LinkedBlockingQueue
LinkedBlockingQueue也是接口BlockingQueue的阻塞实现队列之一。
基于链表实现的一个阻塞队列,在创建对象时如果不指定容量大小,则默认大小为Integer.MAX_VALUE,所以要注意一个问题,如果初始化时没有指定容量,生产者放入元素远大于消费者取出元素的速度时,那么生产的元素一直在链表中存在,这会对内存造成很大压力。
由于是基于链表的,所以生产者每次放入元素会构造一个新节点对象,在大量并发的情况下可能会对系统GC造成一定影响,而ArrayBlockingQueue不存在这种情况。LinkedBlockingQueue同样是使用通知模式来实现。相对于ArrayBlockingQueue,LinkedBlockingQueue生产者和消费者分别使用两把重入锁来实现同步,所以可以提高系统的并发度。

SynchronousQueue

SynchronousQueue 不是一个真正的队列,是一个生产任务的线程,也可以说是一种管理直接在线程间移交信息的机制。
当它生产产品(即put的时候),如果当前没有人想要消费产品(即当前没有线程执行take),则此生产线程阻塞,必须等待一个消费线程调用take操作,才会唤醒该生产线程,同时消费线程会获取生产线程的产品(即数据传递)。这样的一个过程称为一次配对过程(当然也可以先take后put,原理是一样的)