美文网首页
ConcurrentLinkedQueue学习的一点感悟

ConcurrentLinkedQueue学习的一点感悟

作者: lycheeLo | 来源:发表于2017-06-21 17:59 被阅读0次

    简介: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

    ---未完

    相关文章

      网友评论

          本文标题:ConcurrentLinkedQueue学习的一点感悟

          本文链接:https://www.haomeiwen.com/subject/chutcxtx.html