You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:24:04