这段代码是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是什么意思呢,这是否存在逻辑问题?

AbstractQueuedSynchronizer中CAS的疑惑 >> java

这个答案描述的挺清楚的:
http://www.goodpm.net/postreply/java/1010000008890439/AbstractQueuedSynchronizer中CAS的疑惑.html

最新文章

  1. ajax获取json数据 for select2
  2. Hadoop Cluster 安装
  3. SQLServer的数据存储结构01 文件与文件组
  4. Simplest way to serve static data from outside the application server in a Java web application
  5. Eclipse导出可执行Jar文件(包含第三方Jar包)
  6. Ceph源码解析:PG peering
  7. uva 10152 ShellSort 龟壳排序(希尔排序?)
  8. js-shortid:优雅简洁地实现短ID
  9. ReactiveCocoa 谈谈concat
  10. (3)选择元素——(9)为交替的列加样式(Styling alternate rows)
  11. Python - 字符串的替换(interpolation) 具体解释
  12. java基础,集合,HashMap,源码解析
  13. 解决sqlserver数据库显示单个用户
  14. CentOS7 安装中文输入法
  15. SQL语句害死人
  16. CF980E
  17. Vue 根组件,局部,全局组件 | 组件间通信,案例组件化
  18. HTML页面加载完毕后运行的js
  19. Scrapy学习篇(十三)之scrapy-splash
  20. Pollard Rho因子分解算法

热门文章

  1. ML学习笔记- 神经网络
  2. Selenium启动不同浏览器
  3. python对象 -- 组合
  4. 以SqlHelper为例论面向对象中封装的使用
  5. 微信小程序中获取高度及设备的方法
  6. Android PullToRrefresh 自定义下拉刷新动画 (listview、scrollview等)
  7. 使用最新vue_cli+webpack搭建的模版
  8. jsp指令和学习笔记集锦
  9. 「JavaSE 重新出发」05.02 泛型数组列表、包装类
  10. hook的本质就是在本原可执行文件中加东西