Java:既然有了synchronized,為什么還要提供Lock?( 二 )

  • lockInterruptibly()
支持中斷 。
  • tryLock()方法
tryLock()方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失?。存i已被其他線程獲?。?,则范\豧alse , 也就說這個方法無論如何都會立即返回 。在拿不到鎖時不會一直在那等待 。
  • tryLock(long time, TimeUnit unit)方法
tryLock(long time, TimeUnit unit)方法和tryLock()方法是類似的,只不過區別在于這個方法在拿不到鎖時會等待一定的時間,在時間期限之內如果還拿不到鎖,就返回false 。如果一開始拿到鎖或者在等待期間內拿到了鎖,則返回true 。
也就是說 , 對于死鎖問題,Lock能夠破壞不可剝奪的條件,例如,我們下面的程序代碼就破壞了死鎖的不可剝奪的條件 。
public class TansferAccount{ private Lock thisLock = new ReentrantLock(); private Lock targetLock = new ReentrantLock(); //賬戶的余額 private Integer balance; //轉賬操作 public void transfer(TansferAccount target, Integer transferMoney){ boolean isThisLock = thisLock.tryLock(); if(isThisLock){ try{ boolean isTargetLock = targetLock.tryLock(); if(isTargetLock){ try{ if(this.balance >= transferMoney){ this.balance -= transferMoney; target.balance += transferMoney; } }finally{ targetLock.unlock } } }finally{ thisLock.unlock(); } } }}例外 , Lock下面有一個ReentrantLock,而ReentrantLock支持公平鎖和非公平鎖 。
在使用ReentrantLock的時候 ,  ReentrantLock中有兩個構造函數,一個是無參構造函數 ,  一個是傳入fair參數的構造函數 。fair參數代表的是鎖的公平策略,如果傳入true就表示需要構造一個公平鎖 ,  反之則表示要構造一個非公平鎖 。如下代碼片段所示 。
//無參構造函數: 默認非公平鎖public ReentrantLock() {sync = new NonfairSync();}//根據公平策略參數創建鎖public ReentrantLock(boolean fair){sync = fair ? new FairSync() : new NonfairSync();}鎖的實現在本質上都對應著一個入口等待隊列,如果一個線程沒有獲得鎖,就會進入等待隊列,當有線程釋放鎖的時候, 就需要從等待隊列中喚醒一個等待的線程 。如果是公平鎖,喚醒的策略就是誰等待的時間長, 就喚醒誰 ,  很公平; 如果是非公平鎖,則不提供這個公平保證,有可能等待時間短的線程反而先被喚醒 。而Lock是支持公平鎖的,synchronized不支持公平鎖 。
最后,值得注意的是 , 在使用Lock加鎖時,一定要在finally{}代碼塊中釋放鎖 , 例如,下面的代碼片段所示 。
try{ lock.lock();}finally{ lock.unlock();}注:其他synchronized和Lock的詳細說明 , 小伙伴們自行查閱即可 。
點擊關注,第一時間了解華為云新鮮技術~
【Java:既然有了synchronized,為什么還要提供Lock?】

推薦閱讀