1. 程式人生 > >AbstractQueuedSynchronizer中CAS的疑惑

AbstractQueuedSynchronizer中CAS的疑惑

eply ood tle 存在 tail 指向 dex pos queue

這段代碼是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的疑惑