ReentrantLock可重入鎖的原理及使用場景

2022-04-19 09:26:17 字數 1247 閱讀 7086

從使用場景的角度出發來介紹對reentrantlock的使用,相對來說容易理解一些。

a、忽略重複加鎖。

b、用在介面互動時點選執行較長時間請求操作時,防止多次點選導致後台重複執行(忽略重複觸發)。

以上兩種情況多用於進行非重要任務防止重複執行,(如:清除無用臨時檔案,檢查某些資源的可用性,資料備份操作等)

if (lock.trylock())  finally

}

這種其實屬於場景2的改進,等待獲得鎖的操作有乙個時間的限制,如果超時則放棄執行。

用來防止由於資源處理不當長時間占用導致死鎖情況(大家都在等待資源,導致執行緒佇列溢位)。

try

finally

}} catch

(interruptedexception e)

這種比較常見大家也都在用,主要是防止資源使用衝突,保證同一時間內只有乙個操作可以使用該資源。

但與synchronized的明顯區別是效能優勢(伴隨jvm的優化這個差距在減小)。同時lock有更靈活的鎖定方式,公平鎖與不公平鎖,而synchronized永遠是公平的。

這種情況主要用於對資源的爭搶(如:檔案操作,同步訊息傳送,有狀態的操作等)

reentrantlock預設情況下為不公平鎖

private reentrantlock lock = new reentrantlock(); //

引數預設false,不公平鎖

private reentrantlock lock = new reentrantlock(true); //

公平鎖try

finally

不公平鎖與公平鎖的區別:

公平情況下,操作會排乙個隊按順序執行,來保證執行順序。(會消耗更多的時間來排隊)

不公平情況下,是無序狀態允許插隊,jvm會自動計算如何處理更快速來排程插隊。(如果不關心順序,這個速度會更快)

synchronized與lock在預設情況下是不會響應中斷(interrupt)操作,會繼續執行完。lockinterruptibly()提供了可中斷鎖來解決此問題。(場景3的另一種改進,沒有超時,只能等待中斷或執行完畢)

這種情況主要用於取消某些操作對資源的占用。如:(取消正在同步執行的操作,來防止不正常操作長時間占用造成的阻塞)

try

catch

(interruptedexception e)

finally

可重入鎖reentrantLock

reentrantlock可重入獨佔鎖 獨佔 就是在同一時刻只能有乙個執行緒獲取到鎖,而其它獲取鎖的執行緒只能處於同步佇列中等待,只有獲取鎖的執行緒釋放了鎖,後繼的執行緒才能夠獲取鎖。可重入 就是支援重進入的鎖,它表示該鎖能夠支援乙個執行緒對資源的重複加鎖。a.公平鎖和非公平鎖 當b執行緒請求鎖,發...

ReentrantLock可重入鎖

reentrantlock,是乙個可重入且獨佔式的鎖,是一種遞迴無阻塞的同步鎖。和synchronized關鍵字相比,它更靈活 更強大,增加了輪詢 超時 中斷等高階功能。步驟1 reentrantlock的遞迴實現public class reentrantlockdemo 次 n if n 2 c...

可重定位目標檔案

目標檔案有三種形式 1.可重定位目標檔案 2.可執行目標檔案 3.共享目標檔案 編譯器和彙編器生成可重定位目標檔案 共享目標檔案,聯結器生成可執行目標檔案。在這裡我們首先介紹可重定位目標檔案。可重定位目標檔案 包含二進位制 和資料,可以在編譯時與其他可重定位目標檔案合併起來,建立乙個可執行目標檔案。...