AbstractQueuedSynchronizer中CAS的疑惑
阿新 • • 發佈:2017-10-15
eply ood tle 存在 tail 指向 dex pos queue
AbstractQueuedSynchronizer中CAS的疑惑 >> java
這個答案描述的挺清楚的:
http://www.goodpm.net/postreply/java/1010000008890439/AbstractQueuedSynchronizer中CAS的疑惑.html
這段代碼是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
AbstractQueuedSynchronizer中CAS的疑惑