Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別
在 Lock 接口中,獲取鎖的方法有 4 個:lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly(),為什么需要這么多方法?這些方法都有什么區(qū)別?接下來我們一起來看。
1.lock 方法
lock 方法是 Lock 接口中最基礎的獲取鎖的方法,當有可用鎖時會直接得到鎖并立即返回,當沒有可用鎖時會一直等待,直到獲取到鎖為止,它的基礎用法如下:
Lock?lock?=?new ReentrantLock(); // 獲取鎖 lock.lock(); try { ????// 執(zhí)行業(yè)務代碼... } finally { //釋放鎖 ????lock.unlock(); }
2.lockInterruptibly 方法
lockInterruptibly 方法和 lock 方法類似,**當有可用鎖時會直接得到鎖并立即返回,如果沒有可用鎖會一直等待直到獲取鎖,但和 lock 方法不同,lockInterruptibly 方法在等待獲取時,如果遇到線程中斷會放棄獲取鎖。**它的基礎用法如下:
Lock lock = new ReentrantLock(); try { // 獲取鎖 lock.lockInterruptibly(); try { // 執(zhí)行業(yè)務方法... } finally { // 釋放鎖 lock.unlock(); } } catch (InterruptedException e) { e.printStackTrace(); }
PS:使用 thread.interrupt() 方法可以中斷線程執(zhí)行。
3.tryLock 方法
與前面的兩個方法不同,使用無參的 tryLock 方法會嘗試獲取鎖,并立即返回獲取鎖的結果(true 或 false),如果有可用鎖返回 true,并得到此鎖,如果沒有可用鎖會立即返回 false。它的基礎用法如下:
Lock lock = new ReentrantLock(); // 獲取鎖 boolean result = lock.tryLock(); if (result) { try { // 獲取鎖成功,執(zhí)行業(yè)務代碼... } finally { // 釋放鎖 lock.unlock(); } } else { // 執(zhí)行獲取鎖失敗的業(yè)務代碼... }
4.tryLock(long,TimeUnit) 方法
**有參數(shù)的 tryLock(long,TimeUnit) 方法需要設置兩個參數(shù),第一個參數(shù)是 long 類型的超時時間,第二個參數(shù)是對參數(shù)一的時間類型描述(比如第一參數(shù)是 3,那么它究竟是 3 秒還是 3 分鐘,是第二個參數(shù)說了算的)。在這段時間內如果獲取到可用的鎖了就返回 true,如果在定義的時間內,沒有得到鎖就會返回 false。**它的基礎用法如下:
Lock lock = new ReentrantLock(); try { // 獲取鎖(最多等待 3s,如果獲取不到鎖就返回 false) boolean result = lock.tryLock(3, TimeUnit.SECONDS); if (result) { try { // 獲取鎖成功,執(zhí)行業(yè)務代碼... } finally { // 釋放鎖 lock.unlock(); } } else { // 執(zhí)行獲取鎖失敗的業(yè)務代碼... } } catch (InterruptedException e) { e.printStackTrace(); }
5.總結
lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly() 都是用來獲取鎖的,其中 lock 方法如果獲取不到鎖會一直阻塞等待;而 lockInterruptibly 方法雖然也會阻塞等待獲取鎖,但它卻能中途響應線程的中斷;無參的 tryLock 方法會立馬返回一個獲取鎖成功與失敗的結果,有參數(shù)的 tryLock(long,TimeUnit) 方法會在設定的時間內返回一個獲取鎖成功與失敗的結果。這 4 個方法的特性各不相同,需要根據(jù)實際的業(yè)務情況選擇合適獲取鎖的方法。
到此這篇關于Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別的文章就介紹到這了,更多相關Java lock內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot swagger 接口文檔分組展示功能實現(xiàn)
這篇文章主要介紹了springboot swagger 接口文檔分組展示功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-03-03