Java之 AQS在幾個同步工具類中的使用

2021-08-20 02:30:43 字數 2110 閱讀 7475

工具類

工具類作用

工具類加鎖方法

工具類釋放鎖方法

sync覆蓋的方法

sync非覆蓋的重要方法

state的作用

鎖型別鎖維護

semaphore

控制同時訪問某個特定資源的運算元量

acquire:每次請求乙個許可都會導致計數器減少1,,一旦達到了0,新的許可請求執行緒將被掛起

release:每呼叫 新增乙個許可,釋放乙個正在阻塞的獲取者

tryacquireshared

tryreleaseshared

表示初始化的許可數

共享鎖每一次請求acquire()乙個許可都會導致計數器減少1,同樣每次釋放乙個許可release()都會導致計數器增加1,一旦達到了0,新的許可請求執行緒將被掛起。

countdownlatch

把一組執行緒全部關在外面,在某個狀態時候放開。一種同步機制來保證乙個或多個執行緒等待其他執行緒完成。

await:在計數器不為0時候阻塞呼叫執行緒,為0時候立即返回

countdown :計數遞減

tryacquireshared

tryreleaseshared

維護乙個計數器

共享鎖初始化乙個計數,每次呼叫countdown方法計數遞減,在計數遞減到0之前,呼叫await的執行緒都會阻塞

reentrantlock

標準的互斥操作,也就是一次只能有乙個執行緒持有鎖

lock:如果沒有執行緒使用則立即返回,並設定state為1;如果當前執行緒已經占有鎖,則state加1;如果其他執行緒占有鎖,則當前執行緒不可用,等待 trylock:如果鎖可用,則獲取鎖,並立即返回值 true。如果鎖不可用,則此方法將立即返回值 false

unlock:嘗試釋放鎖,如果當前執行緒占有鎖則count減一,如果count為0則釋放鎖。如果占有執行緒不是當前執行緒,則拋異常

tryacquire

tryrelease

nonfairtryacquir

state表示獲得鎖的執行緒對鎖的重入次數。

排他鎖。

獲取鎖時,如果沒有執行緒使用則立即返回,並設定state為1;如果當前執行緒已經占有鎖,則state加1;如果其他執行緒占有鎖,則當前執行緒不可用。釋放鎖時,在該方法中主要作用是state狀態位減少release個,表示釋放鎖,如果更新後的state為0,表示當前執行緒釋放鎖,如果不為0,表示持有鎖的當前執行緒重入數減少

reentrantreadwritelock

讀寫鎖。允許多個讀執行緒同時持有鎖,但是只有乙個寫執行緒可以持有鎖。寫執行緒獲取寫入鎖後可以再次獲取讀取鎖,但是讀執行緒獲取讀取鎖後卻不能獲取寫入鎖

readlock#lock :獲取讀鎖 readlock#trylock:嘗試當前沒有其他執行緒當前持有寫鎖時獲取讀鎖 writelock#lock:獲取寫鎖 writelock#trylock:嘗試當前沒有其他執行緒持有寫鎖時,呼氣寫鎖。

readlock#unlock:釋放讀鎖 writelock#unlock:釋放寫鎖

acquireshared

releaseshared

tryacquire

tryrelease

tryreadlock

trywritelock

高16位表示共享鎖的數量,低16位表示獨佔鎖的重入次數

讀鎖:共享 寫鎖:排他

對於共享鎖,state是計數器的概念。乙個共享鎖就相對於一次計數器操作,一次獲取共享鎖相當於計數器加1,釋放乙個共享鎖就相當於計數器減1;排他鎖維護類似於可重入鎖。

futuretask

封裝乙個執行任務交給其他執行緒去執行,開始執行後可以被取消,可以檢視執行結果,如果執行結果未完成則阻塞。

v get()

run() set(v)

cancel(boolean)

tryacquireshared

tryreleaseshared

innerget

innerrun()

innerset

inneriscancelled

state狀態位來儲存執行狀態running、run、cancelled

共享鎖獲取執行結果的執行緒(可以有多個)一直阻塞,直到執行任務的執行緒執行完畢,或者執行任務被取消。

AQS的幾個同步元件

乙個執行緒或多個執行緒一直等待,直到其他執行緒執行的操作完成才繼續執行。應用 平行計算。計數器是不能重計的,計數值不能往上加,類似操作只有一次。使用時首先new乙個countdownlatch,構造方法中放入計數,然後在乙個執行緒中呼叫await方法,這個執行緒就會進入等待狀態,其他執行緒中呼叫co...

AQS同步工具類對比

工具類 工具類作用 工具類加鎖方法 工具類釋放鎖方法 sync覆蓋的方法 sync非覆蓋的重要方法 state的作用 鎖型別鎖維護 semaphore 控制同時訪問某個特定資源的運算元量 acquire 每次請求乙個許可都會導致計數器減少1,一旦達到了0,新的許可請求執行緒將被掛起 release ...

Java併發之AQS原理詳解

一 abstractqueuedsynchronizer 的用途 下面簡稱 aqs,jdk 1.8 aqs是借助 fifo等待佇列,用來實現同步器的同步框架,通俗的來說,它是用來實現鎖的工具,一般來說,它需要實現這些功能 二 aqs 的工作原理 aqs的核心是基於鍊錶實現的 fifo等待佇列,該佇列...