自己太笨了,總感覺有點繞,就整理下吧~
private node enq
(final node node)
else}}
}private
final
boolean
compareandsethead
(node update)
private
final
boolean
compareandsettail
(node expect, node update)
第一次一定是進入if
當有新的執行緒進入的時候,進入else(其實沒有新的執行緒進入還是要進入else的),紅色的是else所做的操作
總結:這裡面head和tail都是乙個node,但是這裡我理解為乙個類似於指標的東西,它們存在的意義也是為了維持這個雙向的鍊錶,沒有實際的意義,包括prev和next也是。
還是挺繞的,感覺沒必要理解這麼透徹,主要思想就是
第一次進來的時候建立這個雙向鍊錶的空節點,後面傳入新的節點的時候,開始往雙向鍊錶後面新增新的節點,而head和tail永遠指向第乙個和最後乙個,中間都是一些切換指標(我這裡暫且理解為指標吧,也就是賦值操作,比如tail和head的賦值,prev和next的賦值。)
for(;;)是乙個自旋鎖,為了不停的去嘗試新增節點,但是可能存在併發問題,所以通過cas的方式,新增,可能上次被執行緒a搶占先機,這次自己還是要去嘗試,如何進行不斷的嘗試?所以通過自旋鎖解決,當然如果新增成果最後會通過return跳出自旋鎖。
個人認為這個自旋鎖和cas的操作用的很厲害,值得學習!
仔細想想為什麼這麼設計?
因為當前的這個compareandsettail和compareandsethead,這兩個操作,簡單說就是為了切換指標指向,簡單說就是一「操作」,任何操作,因為在作業系統中,雖然我們目前在解決併發問題,但是也是存在併發問題的,對於這個「操作來說」。所以我們可以選擇加鎖,也可以選擇這種cas自旋鎖的方式,因為這個操作可能是很快的,因為可能同時又一萬個執行緒都被阻塞了(極端一點的情況),這個時候,會有很多的切換指標的這個「操作」,反覆的加悲觀鎖的話,沒有cas這種樂觀鎖好。簡單總結下,就是這種cas自旋鎖的方式能提公升效能。
以上全是我的個人理解,可能存在很大的問題,希望沒有誤導到你,如果有問題還希望您及時指出。
AQS中的acquire方法release方法
aqs中的acquire方法解釋,首先呼叫 tryacquire方法判斷當前執行緒是否拿到鎖,沒有拿到的話執行addwaiter方法把失敗的這個執行緒打包成乙個節點,通過迴圈cas機制強行加入到佇列的尾部,該方法的返回值會返回這個節點,再打包交給acquirequeued方法,acquirequeu...
AQS框架 談談對AQS框架的理解
aqs是乙個框架,基於它我們可以實現鎖和同步器,j.u.c.包中和很多鎖和同步器都是基於aqs實現的。使用aqs的方式通常不是讓鎖或同步器直接繼承aqs類,而是將aqs的子類作為鎖或同步器類的乙個輔助內部類,鎖或同步器的方法呼叫aqs子類物件的方法完成同步操作。來自網路 aqs中最重要的乙個字段就是...
關於python中strip方法的理解
1.strip方法並不是去除對稱字串的。比如a 123abcd321 a.strip 方法的結果是abcd 有人可能就把strip方法理解成了 可以去除字串兩端對稱字元 的一種方法。這麼理解是錯誤的。2.strip方法既可以去除字串左側的字元也可以去除字串右側的字元,也可以兩端同時去除。a 123a...