聊聊關於Reentrantlock

2021-10-09 21:00:24 字數 1647 閱讀 9861

reentrantlock—可重入鎖,之前我們學過synchronized,這個鎖也是可重入的,那麼為什麼還需要乙個專門的可重入鎖?這是因為雖然兩者都是可重入的,但reentrantlock相比synchronized功能更加豐富,使用更為靈活,也更適合複雜的併發場景,因此可以用於替代synchronized。

public

class

relocktest1

}catch

(interruptedexception e)

finally

}voidm2(

)finally

}public

static

void

main

(string[

] args)

catch

(interruptedexception e)

newthread

(relock:

:m2,

"t2").

start();}}

這個程式中,首先,需要new乙個reentranlock物件lock,使用lock去鎖住物件,與synchronized作用一樣,但是,需要注意這些語句要寫在try語句塊中,然後在finally中手動釋放鎖。主程式中,兩個執行緒,分別獲取鎖,然後執行方法。最後得到的結果: 0 1 2 3 4 m2…

其中,reentranlock更優秀的一點就是可以在一定時間的範圍內嘗試獲取鎖,如果過了這個時間沒有得到,那也不強求,如下**:

public

class

trylocktest

catch

(interruptedexception e)

finally

}voidm2(

)}catch

(interruptedexception e)

finally

}public

static

void

main

(string[

] args)

}

m1方法在3秒內進行trylock,隨後輸出語句並判斷鎖的狀態,m2方法lock,並在5秒內的每秒輸出數字,main函式中建立兩個執行緒分別呼叫方法,隨後執行。執行結果:如果trylock秒數小於5,則islocked狀態為false,否則為true。

值得注意的是:trylock並不是在一開始就開始搶鎖的,而是在設定秒數是最大時間出進行時間片的搶奪。

reentranlock預設是非公平鎖,如果想要成為公平鎖,那麼在需要new reentranlock(true),這樣傳參成為公平鎖,如果傳參為false或者沒有引數則為非公平鎖。來段**,可以看出公不公平的結果體現

public

class

isfair

implements

runnable

finally}}

public

static

void

main

(string[

] args)

}

測試結果:

java併發 重入鎖 ReentrantLock

使用 github主頁 重入鎖,標識在乙個執行緒中,可重複對該資源重複加鎖。針對於aqs實現重入功能 在重寫tryaquires 的時候考慮同乙個執行緒多次lock的情況即可 偽 thread currentthread thread.currentthread getexclusiveownert...

多執行緒高併發系列之ReenTrantLock鎖

reentrantlock可以替代synchronized鎖,並且比synchronized鎖更靈活 synchronized鎖是自動上鎖 自動解鎖,而reentrantlock需要手動上鎖 手動解鎖synchronized鎖在程式執行時,如果拋異常,jvm會自動釋放鎖,而reentrantlock...

關於作者 聊聊自己的經歷

初心 把自己的經驗,技術,心得與大家共享。獨白 一直沒好好介紹自己,覺得不知如何開始,或者是讀者少的原因吧,現在漸漸多了起來,我想自己不能辜負大家,坦誠以待。法號 李肖遙 爸爸姓李,媽媽姓肖 愛樂器,鍾愛吉他,愛籃球。大家對我的稱呼別叫大佬大神啥的,逍遙哥哥倒是個很好的稱呼,哈哈,不過還是叫李工來的...