深入淺出AQS之元件概覽

2021-09-11 15:34:07 字數 2363 閱讀 8095

之前分析了aqs中的獨佔鎖,共享鎖,條件佇列三大模組,現在從結構上來看看aqs各個元件的情況。

深入淺出aqs之獨佔鎖模式

深入淺出aqs之共享鎖模式

深入淺出aqs之條件佇列

前面三篇文章如果之前沒有aqs基礎的話看起來會比較吃力,這篇文章說明一下aqs的基礎知識,方便快速了解aqs。

首先aqs的基本執行過程就是嘗試獲取鎖,成功則返回,如果失敗就進入同步佇列進行鎖資源的等待。基於這個流程可以看出佇列跟佇列中的節點應該是兩個重點。

首先來看下aqs裡佇列節點node的結構:

node節點

該類中有五個字段,依次來看一下:

prev,next:指向它的前置節點跟後繼節點,由此看出aqs中的同步佇列是個雙向鍊錶。

thread:當前執行緒物件。

waitstatus:當前節點的狀態,是個int型別變數,依次有如下幾種:

值型別說明-1

signal

當前節點的後繼節點被阻塞,因此當當前節點在釋放或者取消的時候需要喚醒它的後繼節點。

1cancelled

當前節點由於超時或者中斷被取消,節點進入這個狀態以後將保持不變。注:這是唯一大於0的值,很多判斷邏輯會用到這個特徵

-2condition

當前節點正處在條件佇列中,在條件達成前不能獲取鎖。

-3propagate

當前節點獲取到鎖的資訊需要傳遞給後繼節點,共享鎖模式使用該值。0無

節點初始狀態。

了解了node節點的資料結構以後,看下獨佔鎖模式下的同步佇列的結構:

獨佔鎖同步佇列

注:head節點是new出來乙個新的node節點,而tail是直接指向佇列中最後乙個節點。

了解了獨佔鎖模式佇列以後,看下共享鎖模式下的同步佇列(注意對比其中的不同):

共享鎖同步佇列

注:共享鎖跟獨佔鎖是同乙個同步佇列,也就是說同步佇列中的節點既可以是共享型別也可以是獨佔型別。

除了獨佔鎖跟共享鎖使用的同步佇列,還有乙個很重要的佇列就是條件佇列,一起看下:

條件佇列

注意區分條件佇列跟同步佇列的區別:1、頭尾指標,2、單鏈表

搞明白了aqs中這些基礎的資料結構以後,最後再看下aqs對外提供的api:

獨佔鎖模式:

方法名說明

acquire

獨佔模式獲取鎖,不響應中斷,如果發生中斷只會把當前執行緒的中斷狀態設定為true

acquireinterruptibly

獨佔模式獲取鎖,如果在獲取鎖的過程中線程被中斷,則直接丟擲中斷異常

release

釋放鎖資源

共享鎖模式:

方法名說明

acquireshared

共享模式獲取鎖,不響應中斷,如果發生中斷只會把當前執行緒的中斷狀態設定為true

acquiresharedinterruptibly

共享模式獲取鎖,如果在獲取鎖的過程中線程被中斷,則直接丟擲中斷異常

releaseshared

釋放鎖資源

條件佇列:

方法名說明

await

阻塞等待條件,如果被中斷則丟擲中斷異常

awaituninterruptibly

阻塞等待條件,不響應中斷,如果發生中斷只會把執行緒中斷狀態設定為true

awaitnanos

等待納秒時間,如果被中斷則丟擲中斷異常

awaituntil

等待直到乙個截止時間,如果被中斷則丟擲中斷異常

await(long time, timeunit unit)

等待乙個指定時間,如果被中斷則丟擲中斷異常

signal

喚醒等待佇列中的第乙個節點

signalall

喚醒等待佇列中的所有節點

擴充套件api:

方法名說明

tryacquire

嘗試獲取獨佔鎖,不阻塞

tryacquirenanos

嘗試在指定納秒時間內獲取獨佔鎖,如果被中斷則丟擲中斷異常

tryrelease

嘗試釋放獨佔鎖,不阻塞

tryacquireshared

嘗試獲取共享鎖,不阻塞

tryacquiresharednanos

嘗試在指定納秒時間內獲取共享鎖,如果被中斷則丟擲中斷異常

tryreleaseshared

嘗試釋放共享鎖,不阻塞

了解了上面介紹的關於aqs的基礎資料結構及api以後,再去看我之前寫的三篇分別介紹獨佔鎖,共享鎖,條件佇列實現原理的文章就不會雲裡霧裡了。

深入淺出AQS之共享鎖模式

在了解了aqs獨佔鎖模式以後,接下來再來看看共享鎖的實現原理。搞清楚aqs獨佔鎖的實現原理之後,再看共享鎖的實現原理就會輕鬆很多。兩種鎖模式之間很多通用的地方本文只會簡單說明一下,就不在贅述了,具體細節可以參考我的上篇文章深入淺出aqs之獨佔鎖模式 一 執行過程概述 獲取鎖的過程 當執行緒呼叫acq...

深入淺出Pytorch 深度學習概覽

文字 分詞 連續文字根據標點空格分成單詞列表。去停詞 去掉出現頻率大,沒有啥意義的單詞,比如吧,哦,了,it,of the 正則化 文字統一化,英文 中文 詞嵌入 n個單詞,每個單詞對應m長的向量 n m n times m n m矩陣。經驗 m 約等於n的四次方根的1到10倍,然後轉化成最近的2次...

深入淺出之STL

c stl 標準模板庫 是一套功能強大的 c 模板類,提供了通用的模板類和函式,這些模板類和函式可以實現多種流行和常用的演算法和資料結構,如向量 鍊錶 佇列 棧。c 標準模板庫的核心包括以下三個元件 元件描述 容器 containers 容器是用來管理某一類物件的集合。c 提供了各種不同型別的容器,...