java队列父类都是Queue,和list对比主要有以下几个特点
- 先进先出
- 线程安全
- 不支持随机访问
队列类型
chatGPT复制过来
-
ArrayBlockingQueue: 基于数组实现的有界阻塞队列。适用于生产者-消费者模式,能够协调生产者和消费者之间的速度差异。
-
LinkedBlockingQueue: 基于链表实现的可选有界/无界阻塞队列。与 ArrayBlockingQueue 不同,LinkedBlockingQueue 可以选择是否有界。同样适用于生产者-消费者模式。
-
PriorityBlockingQueue: 基于堆实现的无界阻塞优先级队列。元素根据优先级进行排序,具有公平性,先进先出顺序。
-
ConcurrentLinkedQueue: 基于链表实现的无界非阻塞队列。适用于高并发场景,不需要额外的同步措施。
-
DelayQueue: 基于优先级队列实现的延迟队列,用于在指定延迟时间后获取元素。适用于定时任务调度等场景。
-
SynchronousQueue: 一种特殊的无容量队列,用于在线程之间传递单个元素。生产者必须等待消费者获取元素后才能插入新元素。
-
LinkedTransferQueue: 基于链表实现的无界队列,具有传输性质。除了普通队列的功能外,还支持直接将元素传输给等待的消费者。
-
LinkedBlockingDeque: 基于链表实现的双端队列,可以在队头和队尾同时进行插入和移除操作。
有界: 需要定义队列容量, 队列已满时抛出异常或等待
无界: 理论上可以无限添加元素 , 可能导致内存溢出
阻塞:
使用上: 读取时 队列没有元素时可以阻塞等待 写入时 阻塞等待空的位置
实现上: 有锁(ReentrantLock 可重入锁),多个线程不可同时进行操作
非阻塞:
使用上: 读取和写入时不能等待
实现上: 无锁,采用其他算法(CAS)来实现线程安全性,多个线程可以同时操作