aqs中的acquire方法解釋,
首先呼叫 tryacquire方法判斷當前執行緒是否拿到鎖,沒有拿到的話執行addwaiter方法把失敗的這個執行緒打包成乙個節點,通過迴圈cas機制強行加入到佇列的尾部,該方法的返回值會返回這個節點,
再打包交給acquirequeued方法,acquirequeued方法會再次自旋嘗試拿鎖,如果嘗試成功則首先找到前乙個節點,也就是從鎖上下來的節點,並將其脫離佇列,
如果獲取鎖又失敗則進入shouldparkafte***iledacquire方法,該方法用來判斷失敗後的執行緒應不應該被阻塞,如果需要則阻塞自己,等待當其他執行緒釋放鎖並將其喚醒
public final void acquire(int arg)
aqs中的release方法解釋,首先找到頭節點,
public final boolean release(int arg)
return false;
}執行unparksuccessor方法,該方法表示找到頭節點後面乙個節點,也就是後繼節點,對這個節點做乙個判斷,判斷其是否注意乙個cancel狀態,如果不是則這個後繼節點又會把頭節點指為自己,如果是cancel狀態的話就不從頭開始找了,這時候會從佇列的尾巴開始找,如果找到了就執行 unpark方法來喚醒找到的這個執行緒,被喚醒的執行緒重複之前的流程進行自旋拿鎖
總結就是拿到了就拿,拿不到繼續自旋拿鎖
private void unparksuccessor(node node) {
/** if status is negative (i.e., possibly needing signal) try
* to clear in anticipation of signalling. it is ok if this
* fails or if status is changed by waiting thread.
*/int ws = node.waitstatus;
if (ws < 0)
compareandsetwaitstatus(node, ws, 0);
關於AQS中的enq方法的理解
自己太笨了,總感覺有點繞,就整理下吧 private node enq final node node else private final boolean compareandsethead node update private final boolean compareandsettail n...
R中各種幫助方法
help.start help functionname 在網頁中顯示 functionname 在控制台顯示 args functionname 快速獲取函式的引數 example functionname 檢視函式的例項 help.search pattern pattern help pack...
併發程式設計之AQS中的CLH佇列
在aqs類檔案的開頭,作者新增了很長一段注釋,向開發者解釋clh佇列,以及aqs對clh佇列的使用。aqs裡面的clh佇列是clh同步鎖的一種變形。其主要從兩方面進行了改造 節點的結構與節點等待機制。在結構上,aqs類引入了頭結點和尾節點,他們分別指向佇列的頭和尾,嘗試獲取鎖 入佇列 釋放鎖等實現都...