之前分析了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 提供了各種不同型別的容器,...