java ReentrantLock可重新進入鎖的使用情境

來源:互聯網
上載者:User

標籤:trace   ber   views   理解   tool   private   檔案操作   catch   gpo   

摘要

從使用情境的角度出發來介紹對ReentrantLock的使用,相對來說容易理解一些。

情境1:如果發現該操作已經在執行中則不再執行(有狀態執行)

a、用在定時任務時,如果任務執行時間可能超過下次計劃執行時間,確保該有狀態任務只有一個正在執行,忽略重複觸發。
b、用在介面互動時點擊執行較長時間請求操作時,防止多次點擊導致後台重複執行(忽略重複觸發)。

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

 

[java] view plain copy 
  1. private ReentrantLock lock = new ReentrantLock();  
  2.   
  3. if (lock.tryLock()) { // 如果已經被lock,則立即返回false不會等待,達到忽略操作的效果  
  4.   
  5.     try {  
  6.   
  7.         // 操作  
  8.   
  9.     } finally {  
  10.         lock.unlock();  
  11.     }  
  12.   
  13. }  

 

?情境2:如果發現該操作已經在執行,等待一個一個執行(同步執行,類似synchronized)

這種比較常見大家也都在用,主要是防止資源使用衝突,保證同一時間內只有一個操作可以使用該資源。
但與synchronized的明顯區別是效能優勢(伴隨jvm的最佳化這個差距在減小)。同時Lock有更靈活的鎖定方式,公平鎖與不公平鎖,而synchronized永遠是公平的。

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

ReentrantLock預設情況下為不公平鎖

 

[java] view plain copy 
  1. private ReentrantLock lock = new ReentrantLock(); //參數預設false,不公平鎖  
  2. private ReentrantLock lock = new ReentrantLock(true); //公平鎖  
  3.   
  4. try {  
  5.     lock.lock(); //如果被其它資源鎖定,會在此等待鎖釋放,達到暫停效果  
  6.    
  7.    //操作  
  8.    
  9. } finally {  
  10.     lock.unlock();  
  11. }  

 

 

?
 

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

公平情況下,操作會排一個隊按順序執行,來保證執行順序。(會消耗更多的時間來排隊)
不公平情況下,是無序狀態允許插隊,jvm會自動計算如何處理更快速來調度插隊。(如果不關心順序,這個速度會更快)

 

情境3:如果發現該操作已經在執行,則嘗試等待一段時間,等待逾時則不執行(嘗試等待執行)

這種其實屬於情境2的改進,等待獲得鎖的操作有一個時間的限制,如果逾時則放棄執行。
用來防止由於資源處理不當長時間佔用導致死結情況(大家都在等待資源,導致線程隊列溢出)。

 

[java] view plain copy 
  1. try {  
  2.     if (lock.tryLock(5, TimeUnit.SECONDS)) { // 如果已經被lock,嘗試等待5s,看是否可以獲得鎖,如果5s後仍然無法獲得鎖則返回false繼續執行  
  3.   
  4.         try {  
  5.   
  6.             // 操作  
  7.   
  8.         } finally {  
  9.             lock.unlock();  
  10.         }  
  11.   
  12.     }  
  13. } catch (InterruptedException e) {  
  14.     e.printStackTrace(); // 當前線程被中斷時(interrupt),會拋InterruptedException  
  15. }  

 

?情境4:如果發現該操作已經在執行,等待執行。這時可中斷進行中的操作立刻釋放鎖繼續下一操作。

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

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

 

[java] view plain copy 
  1. try {  
  2.     lock.lockInterruptibly();  
  3.     //操作  
  4.    
  5. } catch (InterruptedException e) {  
  6.     e.printStackTrace();  
  7. } finally {  
  8.     lock.unlock();  
  9. }  

 

?

可重新進入概念

若一個程式或子程式可以“安全的被並存執行(Parallel computing)”,則稱其為可重新進入(reentrant或re-entrant)的。即當該子程式正在運行時,可以再次進入並執行它(並存執行時,個別的執行結果,都符合設計時的預期)。可重新進入概念是在單線程作業系統的時代提出的。

 

轉載自:http://my.oschina.net/noahxiao/blog/101558

java ReentrantLock可重新進入鎖的使用情境

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.