ConcurrentLinkedQueue学习的一点感悟

2017-06-21  本文已影响0人  lycheeLo

简介:ConcurrentLinkedQueue是一种队列数据结构,数据是FIFO(first input first out)的, 内部采用CAS实现高并发读写安全,而木有采用锁的机制。
记录下学习过程。
这个类两个最重要的属性:
private transient volatile Node<E> head;//队列里面的头
private transient volatile Node<E> tail;//队列的尾

head和 tail 在 ConcurrentLinkedQueue 初始化的时候都会指向同一个Node<Item> 节点,其中 Node 为ConcurrentLinkedQueue 静态内部类。

public ConcurrentLinkedQueue() {
head = tail = new Node<E>(null);①
}

Node 有这两个属性
volatile E item;//当前节点存储的对象
volatile Node<E> next;//指向下一个Node的引用,通过这引用才可以形成链表结构。

offer(E e) //数据进入队列
在未插入数据之前,head和tail 都指向 一个 Node<E> item为空,next 也为null.
贴上代码(JDK1.8):
下面说明下对象刚创建,到第一个数据插入的过程
checkNotNull(e);//检查插入的数据是否为null
final Node<E> newNode = new Node<E>(e);//将插入的数据注入创建的节点类。
for (Node<E> t = tail, p = t;;)//这个是很经典的CAS操作。死循环,直到操作成功return true退出;
Node<E> q = p.next;//新建了两个变量 p,t 都是指向末尾节点,就是指向刚开始创建的那个Node(①位置那个), q节点指向初始化节点的next,这里肯定是空了。
if (q == null) {//进入
if (p.casNext(null, newNode)) { //CAS操作.这个方法的功能是 如果p的成员属性为null,就把它设置为newNode

---未完

上一篇下一篇

猜你喜欢

热点阅读