为了账号安全,请及时绑定邮箱和手机立即绑定

AbstractQueuedSynchronizer中CAS的疑惑

AbstractQueuedSynchronizer中CAS的疑惑

LEATH 2019-03-01 11:15:05
这段代码是AQS框架中将当前节点入队的操作。 Node pred = tail; if (pred != null) { node.prev = pred; if (compareAndSetTail(pred, node)) { pred.next = node; return node; } } 上面代码中pred被赋值为尾节点,node为当前节点。我理解的将新节点插入链表尾处的逻辑应当如下:node.prev = pred; node节点的前驱指向尾节点pred.next = node; 将尾节点的后继设置为当前节点tail = node; 将node节点设置为尾节点对于上面代码我的疑问如下:如果尾节点不为空,node节点的前驱会指向尾节点,然后调用CAS交换pred和node的值。此时pred(即tail)的值应该已经是当前节点node的值了,再执行pred.next=node是什么意思呢,这是否存在逻辑问题?
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

这个设计是一个双向链表.
B.prev == A
A.next == B

compareAndSetTail 设置成功只是将 tail 更新为当前node. pred.next 是将上一个尾部节点的next设置为当前node这逻辑不存在问题.

查看完整回答
反对 回复 2019-03-01
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

compareAndSetTail(pred,node);的意思是说:比较pred的值和tail的值,如果相等,则将node的值赋给tail,那么此时tail就指向了node,node节点变成了新的tail,而pred没有变,还是之前tail指向的节点;

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 380 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信