下面代碼是上個星期阿里社區推送的一道技術題中的代碼。藉助這個代碼,檢驗一下自己。
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