五 多執行緒高階之各種鎖總結

2021-10-22 16:24:43 字數 2332 閱讀 6303

5.2 aqs 同步佇列

5.3 重入鎖

5.4 公平鎖和非公平鎖

5.5 鎖的通訊

5.1.1 lock 與 synchronize 區別

lock : 了鎖獲取與釋放的可操作性、可中斷的獲取鎖以 及超時獲取鎖,可以設定為公平鎖

synchroized : 隱式的釋放鎖,不可以中斷獲取和超時獲取,不可以設定為公平鎖

5.2.1 aqs 是什麼

aqs是 abstractqueuedsynchronizer的簡稱,即 抽象佇列同步器 ,從字⾯意思上理解:

5.2.2 aqs 是用來幹什麼的?

​ 那aqs 有什麼⽤呢?aqs 是⼀個⽤來構建鎖和同步器的框架,使⽤aqs 能簡單且 ⾼效地構造出應⽤⼴泛的同步器,⽐如我們提到的reentrantlock,semaphore,reentrantreadwritelock,synchronousqueue,futuretask等等皆是基於aqs的。

5.2.3 aqs如何使用?

​ 同步器的主要使用方式是繼承,子類通過繼承同步器並實現它的抽象方法來管理同步狀 態

​ 同步器的設計是基於模板方法模式的,也就是說,使用者需要繼承同步器並重寫指定的 方法,隨後將同步器組合在自定義同步元件的實現中,並呼叫同步器提供的模板方法,而這些 模板方法將會呼叫使用者重寫的方法。

5.2.4 aqs 實現分析

5.2.4.1 node節點的屬性型別與名稱以及描述

​ 當前執行緒獲取 同步狀態失敗時,同步器會將當前執行緒以及等待狀態等資訊構造成為乙個節點(node)並將其 加入同步佇列,同時會阻塞當前執行緒,當同步狀態釋放時,會把首節點中的執行緒喚醒,使其再 次嘗試獲取同步狀態。

5.2.4.2 同步佇列基本結構

同步器擁有首節點(head) 和尾節點(tail),沒有成功獲取同步狀態的執行緒將會成為節點加入該佇列的尾部

​同步器將節點加入到同步佇列的過程

首節點的設定:首節點是獲取同步狀態成功的節點,首節點的執行緒在釋放同步狀態 時,將會喚醒後繼節點,而後繼節點將會在獲取同步狀態成功時將自己設定為首節點

5.2.4.3 獨佔式同步狀態獲取與釋放

此處推薦閱讀原始碼,搞清楚 reentantlock 的實現機制,也是面試中的乙個亮點

一行一行閱讀 aqs

下面是整個流程圖

5.3.1 什麼是重入鎖?

重入鎖保證了乙個執行緒可以對乙個資源重複加鎖

5.3.2 重入鎖的實現原理-原始碼

5.4.1公平鎖和非公平鎖是什麼?

​ 公平性與否是針對獲取鎖而言的,如果乙個鎖是公平的,那麼鎖的獲取順序就應該符合請求的絕對時間順序,也就是fifo。

5.4.2 公平鎖和非公平鎖的對比

5.4.3 公平鎖和非公平鎖獲取鎖的區別

唯一不同的位置為判斷條件多了 hasqueuedpredecessors()方法,即加入了同步佇列中當前節點是否有前驅節點的判斷,如果該 方法返回true

5.5.1 condition 是什麼 ?

condition介面也提供了類似object的監視器方法,與lock配合可以實現等待/通知模式

5.5.2 condition 和 synchronize在通訊中的區別?

下面畫紅線的地方是重點

5.5.3 ccondition的使用範例

多執行緒的鎖總結

寫法 synchronized 鎖 執行原理 當執行緒進入同步鎖,會把鎖拿走,執行 塊中的 執行完畢後,會把鎖還回去 如果執行緒遇到同步 塊,發現沒有鎖,將進入等待 有鎖才能進去 注意 保證所有執行緒使用的都是同一把鎖 鎖可以使用任意乙個物件 同乙個物件就行 下面是運用同步鎖編寫的乙個賣門票例子 p...

多執行緒同步之互斥鎖

對於多執行緒程式來說,同步是指在一定的時間內只允許某乙個執行緒訪問某個資源 而在 此時間內,不允許其他的執行緒訪問該資源。同步資源的方式 互斥鎖 條件變數 讀寫鎖 訊號量。下面介紹下互斥鎖 將互斥鎖想象成乙個只能容納乙個人的洗手間,當某個人進入洗手間的時候,可以從 裡面將洗手間鎖上,其他人只能在互斥...

多執行緒學習之鎖和事件

相關api pthread cond signal setevent pthread cond wait waitforsingleobject 0 windows上叫做事件event,linux上叫做條件變數cond 1 事件的狀態分為有訊號 signaled 和無訊號 unsignaled 有時...