【笔记】Java并发编程之美-Java并发包中并发队列原理剖析

ConcurrentLinkedQueue原理探究

线程安全的无界非阻塞队列,底层数据结构使用单向链表,出入队使用CAS实现线程安全。

类图结构

两个volatile类型Node节点存放队列首尾节点。默认头、尾指向item为null的哨兵节点。Node节点内部维护一个使用volatile修饰的变量item,存放节点的值。
在这里插入图片描述

ConcurrentLinkedQueue原理介绍

1.offer操作
队列末尾添加元素,若为null抛出NullPointerException异常,否则由于ConcurrentLinkedQueue是无界队列,方法一直返回true。另外,由于使用CAS无阻塞算法,所以不会引起阻塞。
offer操作中关键步骤是通过原子CAS操作来控制某时只有一个线程可以追加元素到队列末尾。进行CAS竞争失败的线程会反复循环尝试,也就是通过无限循环不断进行CAS操作尝试来代替阻塞算法挂起调用线程。
2.add操作
链表末尾添加元素,其实在内部就是offer。
3.poll操作
队列头部获取并移除一个元素,队列为空返回null。
poll方法移除元素时,只是简单使用CAS操作把当前item值设为null,然后重新设置头节点将该元素从队列移除等待作为孤立节点被回收。另外,如果在执行分支中发现头节点被修改了,要跳到外层循环重新获取头节点。
4.peek操作
获取队列头部一

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值