We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
private Node enq(final Node node) { for (;;) { Node t = tail; if (t == null) { // Must initialize //1. 构造头结点 if (compareAndSetHead(new Node())) tail = head; } else { // 2. 尾插入,CAS操作失败自旋尝试 node.prev = t; if (compareAndSetTail(t, node)) { t.next = node; return t; } } } }
以上为enq()方法。 当队列为null时进入的enq方法,那 第一次循环是创建了头结点并且head,tail都指向此头结点。 那第二次循环是将参数node加入该头结点之后,形成第一个节点。但是为啥代码中tail没有更新呢?(意思就是现在tail,head,t都是指向"头结点")
自己的猜测:是否是在compareAndSetTail(t, node)中更新了tail值。
第二个问题是为什么返回t而不是tail?毕竟不管上面的假设成立不成立,t都指向新插入节点的前一个节点,而不是新节点。
The text was updated successfully, but these errors were encountered:
compareAndSetTail代码如下: private final boolean compareAndSetTail(Node expect, Node update) { return unsafe.compareAndSwapObject(this, tailOffset, expect, update); } tailOffset就是tail域在AQS对象里的偏移量,用CAS更新尾结点。第一个不用猜测,点进去看看就知道了
private final boolean compareAndSetTail(Node expect, Node update) { return unsafe.compareAndSwapObject(this, tailOffset, expect, update); }
从设计上我实在讲不出什么,只能说返回tail没什么意义,可以从以下几点理解
:) 我也是最近才开始看并发的内容,感觉能有人一起讨论问题还是挺好的,你可以加我QQ:624684849 ,一起讨论问题
Sorry, something went wrong.
No branches or pull requests
以上为enq()方法。
当队列为null时进入的enq方法,那
第一次循环是创建了头结点并且head,tail都指向此头结点。
那第二次循环是将参数node加入该头结点之后,形成第一个节点。但是为啥代码中tail没有更新呢?(意思就是现在tail,head,t都是指向"头结点")
自己的猜测:是否是在compareAndSetTail(t, node)中更新了tail值。
第二个问题是为什么返回t而不是tail?毕竟不管上面的假设成立不成立,t都指向新插入节点的前一个节点,而不是新节点。
The text was updated successfully, but these errors were encountered: