從使用場景的角度出發來介紹對reentrantlock的使用,相對來說容易理解一些。
a、忽略重複加鎖。
b、用在介面互動時點選執行較長時間請求操作時,防止多次點選導致後台重複執行(忽略重複觸發)。
以上兩種情況多用於進行非重要任務防止重複執行,(如:清除無用臨時檔案,檢查某些資源的可用性,資料備份操作等)
if (lock.trylock()) finally}
這種其實屬於場景2的改進,等待獲得鎖的操作有乙個時間的限制,如果超時則放棄執行。
用來防止由於資源處理不當長時間占用導致死鎖情況(大家都在等待資源,導致執行緒佇列溢位)。
tryfinally
}} 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的另一種改進,沒有超時,只能等待中斷或執行完畢)
這種情況主要用於取消某些操作對資源的占用。如:(取消正在同步執行的操作,來防止不正常操作長時間占用造成的阻塞)
trycatch
(interruptedexception e)
finally
可重入鎖reentrantLock
reentrantlock可重入獨佔鎖 獨佔 就是在同一時刻只能有乙個執行緒獲取到鎖,而其它獲取鎖的執行緒只能處於同步佇列中等待,只有獲取鎖的執行緒釋放了鎖,後繼的執行緒才能夠獲取鎖。可重入 就是支援重進入的鎖,它表示該鎖能夠支援乙個執行緒對資源的重複加鎖。a.公平鎖和非公平鎖 當b執行緒請求鎖,發...
ReentrantLock可重入鎖
reentrantlock,是乙個可重入且獨佔式的鎖,是一種遞迴無阻塞的同步鎖。和synchronized關鍵字相比,它更靈活 更強大,增加了輪詢 超時 中斷等高階功能。步驟1 reentrantlock的遞迴實現public class reentrantlockdemo 次 n if n 2 c...
可重定位目標檔案
目標檔案有三種形式 1.可重定位目標檔案 2.可執行目標檔案 3.共享目標檔案 編譯器和彙編器生成可重定位目標檔案 共享目標檔案,聯結器生成可執行目標檔案。在這裡我們首先介紹可重定位目標檔案。可重定位目標檔案 包含二進位制 和資料,可以在編譯時與其他可重定位目標檔案合併起來,建立乙個可執行目標檔案。...