Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別
在 Lock 接口中,獲取鎖的方法有 4 個(gè):lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly(),為什么需要這么多方法?這些方法都有什么區(qū)別?接下來(lái)我們一起來(lái)看。

1.lock 方法
lock 方法是 Lock 接口中最基礎(chǔ)的獲取鎖的方法,當(dāng)有可用鎖時(shí)會(huì)直接得到鎖并立即返回,當(dāng)沒(méi)有可用鎖時(shí)會(huì)一直等待,直到獲取到鎖為止,它的基礎(chǔ)用法如下:
Lock?lock?=?new ReentrantLock();
// 獲取鎖
lock.lock();
try {
????// 執(zhí)行業(yè)務(wù)代碼...
} finally {
//釋放鎖
????lock.unlock();
}2.lockInterruptibly 方法
lockInterruptibly 方法和 lock 方法類(lèi)似,**當(dāng)有可用鎖時(shí)會(huì)直接得到鎖并立即返回,如果沒(méi)有可用鎖會(huì)一直等待直到獲取鎖,但和 lock 方法不同,lockInterruptibly 方法在等待獲取時(shí),如果遇到線程中斷會(huì)放棄獲取鎖。**它的基礎(chǔ)用法如下:
Lock lock = new ReentrantLock();
try {
// 獲取鎖
lock.lockInterruptibly();
try {
// 執(zhí)行業(yè)務(wù)方法...
} finally {
// 釋放鎖
lock.unlock();
}
} catch (InterruptedException e) {
e.printStackTrace();
}PS:使用 thread.interrupt() 方法可以中斷線程執(zhí)行。
3.tryLock 方法
與前面的兩個(gè)方法不同,使用無(wú)參的 tryLock 方法會(huì)嘗試獲取鎖,并立即返回獲取鎖的結(jié)果(true 或 false),如果有可用鎖返回 true,并得到此鎖,如果沒(méi)有可用鎖會(huì)立即返回 false。它的基礎(chǔ)用法如下:
Lock lock = new ReentrantLock();
// 獲取鎖
boolean result = lock.tryLock();
if (result) {
try {
// 獲取鎖成功,執(zhí)行業(yè)務(wù)代碼...
} finally {
// 釋放鎖
lock.unlock();
}
} else {
// 執(zhí)行獲取鎖失敗的業(yè)務(wù)代碼...
}4.tryLock(long,TimeUnit) 方法
**有參數(shù)的 tryLock(long,TimeUnit) 方法需要設(shè)置兩個(gè)參數(shù),第一個(gè)參數(shù)是 long 類(lèi)型的超時(shí)時(shí)間,第二個(gè)參數(shù)是對(duì)參數(shù)一的時(shí)間類(lèi)型描述(比如第一參數(shù)是 3,那么它究竟是 3 秒還是 3 分鐘,是第二個(gè)參數(shù)說(shuō)了算的)。在這段時(shí)間內(nèi)如果獲取到可用的鎖了就返回 true,如果在定義的時(shí)間內(nèi),沒(méi)有得到鎖就會(huì)返回 false。**它的基礎(chǔ)用法如下:
Lock lock = new ReentrantLock();
try {
// 獲取鎖(最多等待 3s,如果獲取不到鎖就返回 false)
boolean result = lock.tryLock(3, TimeUnit.SECONDS);
if (result) {
try {
// 獲取鎖成功,執(zhí)行業(yè)務(wù)代碼...
} finally {
// 釋放鎖
lock.unlock();
}
} else {
// 執(zhí)行獲取鎖失敗的業(yè)務(wù)代碼...
}
} catch (InterruptedException e) {
e.printStackTrace();
}5.總結(jié)
lock()、tryLock()、tryLock(long,TimeUnit)、lockInterruptibly() 都是用來(lái)獲取鎖的,其中 lock 方法如果獲取不到鎖會(huì)一直阻塞等待;而 lockInterruptibly 方法雖然也會(huì)阻塞等待獲取鎖,但它卻能中途響應(yīng)線程的中斷;無(wú)參的 tryLock 方法會(huì)立馬返回一個(gè)獲取鎖成功與失敗的結(jié)果,有參數(shù)的 tryLock(long,TimeUnit) 方法會(huì)在設(shè)定的時(shí)間內(nèi)返回一個(gè)獲取鎖成功與失敗的結(jié)果。這 4 個(gè)方法的特性各不相同,需要根據(jù)實(shí)際的業(yè)務(wù)情況選擇合適獲取鎖的方法。
到此這篇關(guān)于Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別的文章就介紹到這了,更多相關(guān)Java lock內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA項(xiàng)目如何打包部署到Linux服務(wù)器上
本文詳細(xì)介紹了在服務(wù)器上部署環(huán)境包括JDK、MySQL、Tomcat的設(shè)置,以及使用Idea-Maven-SpringBoot進(jìn)行jar包打包部署的流程,內(nèi)容涵蓋了MySQL配置注意事項(xiàng)、pom.xml配置、打包命令等關(guān)鍵步驟,同時(shí),也提供了如何將jar包上傳到Linux服務(wù)器并運(yùn)行的具體方法2024-10-10
關(guān)于Spring多數(shù)據(jù)源TransactionManager沖突的解決方案
這篇文章主要介紹了關(guān)于Spring多數(shù)據(jù)源TransactionManager沖突的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式
這篇文章主要介紹了maven實(shí)現(xiàn)jar包導(dǎo)入+導(dǎo)出方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
關(guān)于jackson序列化和feign返回值的問(wèn)題
這篇文章主要介紹了關(guān)于jackson序列化和feign返回值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
詳解Spring中使用@within與@target的區(qū)別
這篇文章主要介紹了Spring中使用@within與@target的一些區(qū)別,本文通過(guò)項(xiàng)目案例給大家詳細(xì)分析,給大家介紹的非常詳細(xì),代碼簡(jiǎn)單易懂,需要的朋友可以參考下2021-09-09

