Synchronized可重入鎖分析

2022-07-01 08:18:08 字數 1431 閱讀 8472

可重入鎖又稱遞迴鎖,是指在同乙個執行緒在外層方法獲取鎖的時候,再進入該執行緒的內層方法會自動獲取鎖(前提是鎖物件必須是同一物件或者class),

不會因為之前已經獲取過還沒實方而發生阻塞。即同一執行緒可執行多個持有同乙個鎖的方法。

先來一段**:

public

class

reentrantsynchronized

public

synchronized

void

secondiphonebyelectric()

public

static

void

main(string args)

}

就像乙個多用充電線可以同時給多部iphone充電,但是不會發生任何衝突和阻塞,也就是第一部iphone可以獲取充電線(鎖)充電的同時還可以第二部iphone也可以獲取充電線(鎖)進行充電。

執行結果如下:

在上面的**中,類中的兩個方法都被內建鎖synchronized修飾,給第一部手機充電的同時(firstiphonebyelectric方法中)給第二部手機充電(呼叫了secondiphonebyelectric方法)。

因為充電線時多用的(synchronized是可重入的),所以同乙個人給第二部手機充電時可以直接用該多用充電線進行充電(在同一執行緒在呼叫secondiphonebyelectric時可以直接獲得

當前物件的鎖,進入secondiphonebyelectric進行操作)。

設想:該充電線是單用的(如果synchronized不是可重入的),那麼給第二部手機充電時必須等到第一部手機充電完成釋放充電線後才能進行(當前執行緒在呼叫secondiphonebyelectric

之前必須將firstiphonebyelectric獲取的鎖釋放掉),實際上該充電線已經被第一部手機占用,且無法釋放,(該物件鎖被當前執行緒所持有,且無法釋放),所以此時會出現死鎖。

這是什麼原理呢?

當執行緒嘗試獲取鎖時,可重入鎖先嘗試獲取並更新status值,如果status == 0表示沒有其他執行緒在執行同步**,則把status置為1,當前執行緒開始執行。如果status != 0,

則判斷當前執行緒是否是獲取到這個鎖的執行緒,如果是的話執行status+1,且當前執行緒可以再次獲取鎖。而非可重入鎖是直接去獲取並嘗試更新當前status的值,如果status != 0

的話會導致其獲取鎖失敗,當前執行緒阻塞。

釋放鎖時,可重入鎖同樣先獲取當前status的值,在當前執行緒是持有鎖的執行緒的前提下。如果status-1 == 0,則表示當前執行緒所有重複獲取鎖的操作都已經執行完畢,

然後該執行緒才會真正釋放鎖。而非可重入鎖則是在確定當前執行緒是持有鎖的執行緒之後,直接將status置為0,將鎖釋放。

10 Synchronized 悲觀鎖,可重入鎖

synchronized 悲觀鎖,可重入鎖 特點 可重入的鎖 可重入鎖,乙個獲得的鎖的執行緒沒執行完可以繼續獲得該鎖。執行緒占用鎖的時候,如果執行的同步 出現異常,會自動將鎖讓出。同步 塊的 是同步執行的 一次執行完 而非同步 塊的 可以非同步執行。要求鎖的獲取和釋放存在同乙個塊結構中 當獲取了多個...

Synchronized可重入鎖通俗易懂的簡單分析

可重入鎖概念 當乙個執行緒得到乙個物件鎖後,再次請求此物件時時可以再次得到該物件的鎖的,這也證明synchronized方法 塊的內部呼叫本類的其他synchronized方法 塊時,時永遠可以得到鎖的。public class service synchronized public void se...

可重入函式 可重入核心

可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...