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操作
获取队列头部一