Java中如何不删除元素获取ConcurrentLinkedQueue的头部元素
解答:Java中不删除元素获取ConcurrentLinkedQueue队头的方案
核心实现方法
直接调用ConcurrentLinkedQueue自带的peek()方法即可,该方法的原生设计就是获取但不移除队列的头部元素,如果队列为空则返回null。
方法特性说明
- 线程安全:
peek()方法和ConcurrentLinkedQueue的其他读写方法一样,基于无锁CAS实现,并发场景下调用不会有线程安全问题,也不会产生锁开销。 - 弱一致性保障:并发场景下
peek()返回的是调用瞬间的队头快照,调用完成后如果其他线程执行了poll()/remove()操作移除了该队头,你已获取到的元素对象不会受影响,只是该元素可能已经不在当前队列中,这是无锁并发队列的正常弱一致特性,不属于异常。
可选替代方案
如果你确定队列在调用时一定不为空,可以用element()方法,它的作用同样是获取但不移除队头,区别在于如果队列为空会直接抛出NoSuchElementException,适合需要快速感知空队列异常的场景。
反例提醒
不要使用poll()方法实现该需求,poll()会在获取队头的同时将元素从队列中移除,不符合不修改队列的要求。
代码示例
import java.util.concurrent.ConcurrentLinkedQueue; public class ConcurrentQueueDemo { public static void main(String[] args) { ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>(); queue.offer(10); queue.offer(20); // 非移除式获取队头 Integer head = queue.peek(); System.out.println("队头元素:" + head); // 输出 10 System.out.println("获取后队列长度:" + queue.size()); // 输出 2,元素未被移除 } }
注意事项
调用peek()后必须先判断返回值是否为null,再执行后续业务逻辑,避免空指针异常。
内容的提问来源于stack exchange,提问作者Santosh Sahu
相关产品推荐
相关产品推荐

