天天看點

一文帶你了解.Net混合鎖和lock語句

一文帶你了解.Net混合鎖和lock語句

相比前面的鎖來說,混合鎖的性能更高,任何引用類型的對象都可以做為鎖對象,不需要事先建立指定類型的執行個體,并且設計的非托管的資源由.Net運作時自動釋放,不需要手動調用釋放函數,擷取和釋放混合鎖需要使用System.Threading.Monitor類中的函數。使用Monitor使用混合鎖的例子如下:

C# 調用lock語句來簡化System.Threading.Monitor類擷取和釋放鎖的代碼。以下是使用lock的執行個體

混合鎖的特征是在擷取失敗後像自旋鎖一樣重試一定的次數,超過一定次數後再安排線程進入等待狀态,

混合所的好處是,如果第一次擷取鎖失敗,但其他線程馬上釋放了鎖,目前線程在下一輪重試可以擷取成功,不需要執行毫秒級的線程排程處理;如果其他線程在短時間内沒有釋放鎖,線程會在超過重試次數後進入等待狀态,以避免消耗CPU資源,是以混合鎖适用于大部分場景。

所有引用類型的對象都可以作為鎖對象的原理是,引用類型的對象都有一個32位(4位元組)的對象頭,對象頭的位置在對象位址之前,例如對象的内容在記憶體位址中0×7fff2008時,對象頭的位址在0×7fff2004。在32位的對象頭中,高6位用于儲存标志,低26位儲存的内容根據标志而定,可以存儲目前擷取該鎖的線程Id和進入次數(用入實作可重入),也可以儲存同步塊索引。

同步塊是一個包含所屬線程對象,進入次數和事件對象的對象。事件對象可用于讓線程進入等待狀态和喚醒線程,同步塊會按需要建立(如果隻是用自旋鎖可擷取鎖則無需建立)并自動釋放,.Net運作時内部有一個儲存同步塊的數組,同步塊索引指的是同步塊在這個數組中的索引.

一文帶你了解.Net混合鎖和lock語句
本文基于.Net Core底層入門總結内容
如有哪裡講得不是很明白或是有錯誤,歡迎指正 如您喜歡的話不妨點個贊收藏一下吧🙂 個人微信
一文帶你了解.Net混合鎖和lock語句