日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么在释放锁的时候是从 tail 进行扫描

發(fā)布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么在释放锁的时候是从 tail 进行扫描 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

回到enq那個方法、在標注為紅色部分的代碼來看一個新的節(jié)點是如何加入到鏈表中的。

1. 將新的節(jié)點的prev指向tail?

2. 通過cas將tail設置為新的節(jié)點,因為cas是原子操作所以能夠保證線程安全性

3. t.next=node;設置原tail的next節(jié)點指向新的節(jié)點

private Node enq(final Node node) { for (;;) { Node t = tail; if (t == null) { // Must initialize if (compareAndSetHead(new Node())) tail = head; } else { node.prev = t; if (compareAndSetTail(t, node)) { t.next = node; return t; } } } }

在cas操作之后,t.next=node操作之前。?存在其他線程調(diào)用unlock方法從head開始往后遍歷,由于t.next=node還沒執(zhí)行意味著鏈表的關(guān)系還沒有建立完整。就會導致遍歷到t節(jié)點的時候被中斷。所以從后往前遍歷,一定不會存在這個問題。

圖解分析

通過鎖的釋放,原本的結(jié)構(gòu)就發(fā)生了一些變化。head節(jié)點的waitStatus變成了0,?ThreadB被喚醒

?

總結(jié)

以上是生活随笔為你收集整理的为什么在释放锁的时候是从 tail 进行扫描的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。