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