關於AQS中的enq方法的理解

2021-10-03 22:15:02 字數 1301 閱讀 9515

自己太笨了,總感覺有點繞,就整理下吧~

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...