AQS簡介 2 方法

2021-10-08 13:27:21 字數 3883 閱讀 4471

//結點入隊,必要的時候需要初始化

private node enq

(final node node)

else}}

}

/**

* 當前執行緒或給定模式的結點入隊

*/private node addwaiter

(node mode)

}//結點入隊,具體看上面

enq(node)

;//返回入隊的結點

return node;

}

/**

* 喚醒後繼(如果存在的話)

*/private

void

unparksuccessor

(node node)

if(s != null)

//喚醒執行緒

locksupport.

unpark

(s.thread)

;}

/**

* 設定頭結點並且後繼引用可直接獲取鎖

*/private

void

setheadandpropagate

(node node,

int propagate)

}

/**

* 取消正在嘗試獲取鎖的執行緒

*/private

void

cancelacquire

(node node)

else

else

node.next = node;

// help gc

}}

/**

* 字面直接翻譯下:

* 檢查並更新無法獲取的節點的狀態。如果執行緒應該阻塞,則返回true。

* 這是所有採集迴路中的主要訊號控制。要求 pred == node.prev

* * 簡單說下:判斷是否可以掛起當前執行緒

* @param pred 前繼結點的狀態

* @param node 結點

* @return 如果執行緒阻塞返回 true,反之 false

*/private

static

boolean

shouldparkafte***iledacquire

(node pred, node node)

while

(pred.waitstatus >0)

; pred.next = node;

}else

return

false

;}

/**

* 自我中斷(嚇死爹了,是個狠角色)

*/static

void

selfinterrupt()

/**

* 阻塞當前執行緒並檢查執行緒是否中斷

*/private

final

boolean

parkandcheckinterrupt()

/**

* 以 獨佔 不中斷模式獲取鎖

* 用於 獲取 和條件等待佇列方法 中

*/final

boolean

acquirequeued

(final node node,

int arg)if(

shouldparkafte***iledacquire

(p, node)

&&parkandcheckinterrupt()

)//判斷是否可以掛起並且當前執行緒阻塞

interrupted =

true;}

}finally

}

/**

* 可中斷的方式獲取鎖

* 大部分**和上面 acquirequeued 方法類似,所以只在不一樣的地方加注釋

*/private

void

doacquireinterruptibly

(int arg)

throws interruptedexception

// 執行緒被喚醒後如果發現中斷請求就丟擲異常if(

shouldparkafte***iledacquire

(p, node)

&&parkandcheckinterrupt()

)throw

newinterruptedexception()

;}}finally

}

/**

* 以限定超時時間模式獲取鎖

* 大部分**和上面 acquirequeued 方法類似,所以只在不一樣的地方加注釋

*/private

boolean

doacquirenanos

(int arg,

long nanostimeout)

throws interruptedexception

//看時間是否到了,超時時間到了就返回

nanostimeout = deadline - system.

nanotime()

;if(nanostimeout <=0)

//判斷是否可以掛起

//超時時間大於自旋時間;spinfortimeoutthreshold:自旋超時閾值,預設 1000if(

shouldparkafte***iledacquire

(p, node)

&& nanostimeout > spinfortimeoutthreshold)

//在獲取鎖的期間收到中斷請求就丟擲異常

if(thread.

interrupted()

)throw

newinterruptedexception()

;}}finally

}

/**

* 以 共享 不中斷模式獲取鎖

* 注意和 acquirequeued 的區別

* 上面有的注釋就不在寫了,原諒我偷會懶,(*^▽^*)

*/private

void

doacquireshared

(int arg)}if

(shouldparkafte***iledacquire

(p, node)

&&parkandcheckinterrupt()

) interrupted =

true;}

}finally

}

//釋放鎖

public

final

boolean

release

(int arg)

return

true;}

return

false;}

/** * 以共享的模式釋放鎖

*/private

void

doreleaseshared()

//若頭結點的轉態是 0 ,則設定狀態為 後繼引用 可直接獲取鎖

else

if(ws ==0&&

!compareandsetwaitstatus

(h,0

, node.propagate)

)continue;}

if(h == head)

//結束迴圈

break;}

}

還有一些方法沒有列出,大部分都能在上面注釋中找到對應的解釋。

九 2 方法的使用 二

一 掌握有引數無返回值方法的呼叫 1 有時方法的執行需要依賴某些條件,就像生活中我們做一件事情時,也許需要前提條件,而方法的引數就需要前提條件,下圖示例為帶引數沒有返回值的方法 呼叫帶參方法與呼叫無參方法的語法類似,但在呼叫時必須傳入實際的引數值。2 不能忽視的問題 2.1 呼叫帶參方法時,必須保證...

Ruby學習筆記2(方法 塊 模組)

ruby中的方法就是其他語言中的函式,名稱應以小寫開頭,以免被解釋為常量。引數可有可無,可以有預設值也可以沒有。每個方法都有預設的返回值,就是最後乙個語句的值。def test a1 ruby a2 perl puts 程式語言為 puts 程式語言為 endtest c c test要傳入數量可變...

011 方法(函式)

方法 找乙個人幫我們做事,解決 冗餘問題,將一堆 進行重用的一種機制。函式 就是一段 這段 可能有輸入值 引數 返回值。格式 訪問修飾符 static 返回值型別 方法名 引數列表 方法名 pascal命名法 引數 camel命名法 找乙個人幫你做事,有條件,有結果 return 返回方法的結果 立...