AQS哪些方法是可以重寫,哪些方法是關鍵模版方法?

2021-10-07 18:13:00 字數 1870 閱讀 7884

同步器可以重寫的方法

方法

作用protected boolean tryacquire(int arg)

這是獨佔式獲取同步狀態的方法,該方法的實現需要查詢到當前的同步狀態,同時做出相應判斷,最後再通過cas設定同步狀態

protected boolean tryrelease(int arg)

這是獨佔式釋放同步狀態的方法,讓那些等待獲取同步狀態的執行緒能夠有機會獲取同步狀態

protected int tryacquireshared(int arg)

這是共享式獲取同步狀態的方法,返回的值大於等於0,說明就獲取成功了,否則,就是獲取失敗

protected boolean tryreleaseshared(int arg)

這是共享式釋放同步狀態的方法,讓那些等待獲取同步狀態的執行緒能夠有機會獲取同步狀態

protected boolean isheldexclusively()

這個方法用來判斷當前同步器是否在獨佔模式下被執行緒占用,它會取出占用的執行緒和當前執行緒做個比較,看下是否相等。

aqs的關鍵模版方法

方法

作用public final void acquire(int arg)

這個方法是獨佔式獲取同步狀態的方法,該方法會呼叫重寫的tryacquire()方法來配合做結果判斷,如果當前執行緒獲取同步狀態是成功的,該方法就會返回,如果不成功就會進入同步佇列等待

public final void acquireinterruptibly(int arg)

和acquire()方法類似,不過它多了個響應中斷的能力,當前執行緒未獲取到同步狀態,一樣會進入同步佇列,但是如果當前執行緒被中斷,那就會丟擲interruptedexception異常並返回

public final boolean tryacquirenanos(int arg, long nanostimeout)

在acquireinterruptibly()方法的基礎上又加了超時的限制,這樣可以讓在規定時間內無法獲取到同步器狀態的執行緒直接返回false,當然了如果獲取到則返回true。

public final void acquireshared(int arg)

這是共享式獲取同步狀態的方法,該方法會呼叫重寫的tryacquireshared()方法來配合做結果判斷,如果當前執行緒獲取同步狀態是成功的,該方法就會返回,如果不成功就會進入同步佇列等待,不過這個方法支援同一時刻可以有多個執行緒獲取同步狀態。

public final void acquiresharedinterruptibly(int arg)

和acquireshared()方法類似,不過它多了個響應中斷的能力,當前執行緒未獲取到同步狀態,一樣會進入同步佇列,但是如果當前執行緒被中斷,那就會丟擲interruptedexception異常並返回

public final boolean tryacquiresharednanos(int arg, long nanostimeout)

在acquiresharedinterruptibly()方法的基礎上又加了超時的限制,這樣可以讓在規定時間內無法獲取到同步器狀態的執行緒直接返回false,當然了如果獲取到則返回true。

public final boolean release(int arg)

這也是獨佔式的方法,用來釋放同步狀態,然後將同步佇列中的第乙個節點包含的執行緒喚醒

public final boolean releaseshared(int arg)

這也是共享式的方法,用來釋放同步狀態,然後將同步佇列中的第乙個節點包含的執行緒喚醒

public final collection getqueuedthreads()

獲取等待在同步佇列上的執行緒集合

CSS有哪些屬性是可以繼承的?

個人總結的,雖然不全,但是常見 1 字型系列屬性 font family 字型系列 font weight 字型的粗細 font size 字型的大小 font style 字型的風格 2 文字系列屬性 text indent 文字縮排 text align 文字水平對齊 line height 行...

CSS中有哪些方法可以實現垂直居中?

幾種常用到的垂直居中方法 行內元素 單行 行內元素 1.一般用line height來實現垂直居中,用text ailgn實現水平居中 多行 行內元素 1.用 的vertical align來實現垂直居中 2.用flex彈性布局 塊級元素 1.通過padding實現垂直居中 2.flex布局實現垂直...

Golang 中哪些值是不可以定址的

不可以定址,指的是不能通過 獲得其位址。golang中不能定址的可以總結為 不可變的,臨時結果和不安全的。只要符合其中任何乙個條件,它就是不可以定址的。具體為 常量的值。基本型別值的字面量 算術操作的結果值 對各種字面量的索引表示式和切片表示式的結果值 不過有乙個例外,對切片字面量的索引結果值卻是可...