使用Lock,需要注意的事項?阿里代碼

下面代碼是上個星期阿里社區推送的一道技術題中的代碼。藉助這個代碼,檢驗一下自己。

3秒鐘,看出什麼問題了嗎?

private final static Lock lock = new ReentrantLock();
public static void main(String[] args) {
    try {
        lock.tryLock();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}

看出問題了嗎?

看出來了。給你點贊!!!!

沒有看出來:“革命尚未成功,同志仍須努力”啊。其實寫者當時也只看出了一個問題。嗚嗚嗚。下面是參考阿里給出的解釋,簡單總結的三點,避免踩坑。

問題一:

獲取鎖的方法需要放在try代碼塊之外,並且儘量保證獲取鎖的方法和try代碼塊之間不能存在任何可能拋出異常的代碼。獲取鎖的方法放在try代碼塊中,如果由於try中額外的代碼拋出了異常,這時,如果還沒有獲取到鎖,下面finally中的代碼就會報錯。相同的道理,獲取鎖的方法和try代碼塊之間的代碼拋出異常,try就沒有辦法捕捉到異常,也就沒有辦法釋放鎖,會導致其它的線程無法成功獲取鎖。

問題二:

使用嘗試機制獲取鎖時,在進入業務代碼塊之前,必須先判斷當前線程是否持有鎖。

問題三:

在釋放鎖的時lock.unlock(),需要判斷當前線程是否持有鎖,如果當前線程不持有鎖,調用會拋出 java.lang.IllegalMonitorStateException 異常。

 

參考文章:https://mp.weixin.qq.com/s/Dl72umQuPIcNz_nsbE7j5w

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章