【Java集合 7】java queue用法

【Java集合 7】java queue用法
最新回答
平静后的暴风雨゛

2026-01-20 15:45:30

队列Queue是一种先进先出的数据结构,与list、set等在同一级别,继承了collection接口。队列实现分为阻塞队列和非阻塞队列。阻塞队列有BolckingQueue,JDK提供了7种实现:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue、DelayQueue等。这些队列在插入和移除元素时有特定的逻辑,如当队列已满或空时会阻塞线程,直到队列可用。在实际应用中,ArrayBlockingQueue和LinkedBlockingQueue常用于实现生产者消费者模式。

ArrayBlockingQueue是一个有界阻塞队列,使用数组支持数据存储,吞吐量与一般的实现相似,适合高并发场景。LinkedBlockingQueue则是一个由链表结构组成的双向队列,基于链表进行数据存储,内部维持数据缓冲队列。生产者往队列中放入数据时,队列缓存数据并立即返回,当缓冲区满时才会阻塞生产者;消费者取数据时,队列消费数据并唤醒生产者线程。LinkedBlockingQueue使用独立的锁来控制生产者和消费者操作,提高并发性能。

SynchronousQueue是一个特殊的阻塞队列,不存储元素,添加元素后必须等待其他线程取走后才能继续添加。PriorityBlockingQueue是一个带优先级的队列,元素根据优先级排序,而不是先进先出。DelayQueue则是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。

ArrayBlockingQueue与LinkedBlockingQueue的区别主要体现在队列大小初始化方式、锁的实现以及在生产和消费时的操作不同。ArrayBlockingQueue必须指定队列大小,而LinkedBlockingQueue默认为最大值。ArrayBlockingQueue在生产和消费时直接插入或移除枚举对象,性能较好;LinkedBlockingQueue需要将枚举对象转换为节点进行操作,可能影响性能。ArrayBlockingQueue在大小上通常优于LinkedBlockingQueue,因此优先使用。

非阻塞队列中,ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,采用先进先出规则排序。入队和出队使用CAS(compare and set)操作,允许多个线程并发执行,不会因为加锁而阻塞线程,提高并发性能。CAS是一种用于实现多线程同步的原子指令,用于在内存位置内容与给定值比较相同的情况下,将该内存位置内容修改为新值。

示例代码用于具体实现队列操作,通常包括添加元素(入队)、删除元素(出队)以及队列的容量检查等。队列操作的效率、并发性和具体实现细节会根据应用需求和特定场景进行优化和调整。