詳談Lock與synchronized 的區(qū)別
1、lock是可中斷鎖,而synchronized 不是可中斷鎖
線程A和B都要獲取對(duì)象O的鎖定,假設(shè)A獲取了對(duì)象O鎖,B將等待A釋放對(duì)O的鎖定,
如果使用 synchronized ,如果A不釋放,B將一直等下去,不能被中斷
如果 使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時(shí)間以后,中斷等待,而干別的事情
ReentrantLock獲取鎖定與三種方式:
a) lock(),如果獲取了鎖立即返回,如果別的線程持有鎖,當(dāng)前線程則一直處于休眠狀態(tài),直到獲取鎖
b) tryLock(),如果獲取了鎖立即返回true,如果別的線程正持有鎖,立即返回false;
c) tryLock(long timeout,TimeUnit unit),如果獲取了鎖定立即返回true,如果別的線程正持有鎖,會(huì)等待參數(shù)給定的時(shí)間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時(shí),返回false;
d) lockInterruptibly:如果獲取了鎖定立即返回,如果沒有獲取鎖定,當(dāng)前線程處于休眠狀態(tài),直到或者鎖定,或者當(dāng)前線程被別的線程中斷
2、synchronized是在JVM層面上實(shí)現(xiàn)的,lock是通過代碼實(shí)現(xiàn)的,JVM會(huì)自動(dòng)釋放鎖定(代碼執(zhí)行完成或者出現(xiàn)異常),但是使用Lock則不行,要保證鎖定一定會(huì)被釋放,就必須將unLock()放到finally{}中。
3、在資源競爭不是很激烈的情況下,Synchronized的性能要優(yōu)于ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的性能會(huì)下降幾十倍,但是ReetrantLock的性能能維持常態(tài);
以上這篇詳談Lock與synchronized 的區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解
- Java編程synchronized與lock的區(qū)別【推薦】
- 簡單了解synchronized和lock的區(qū)別
- 淺談Synchronized和Lock的區(qū)別
- 通過實(shí)例解析synchronized和lock區(qū)別
- Java 多線程Synchronized和Lock的區(qū)別
- 淺談Java中Lock和Synchronized的區(qū)別
- Java常用鎖synchronized和ReentrantLock的區(qū)別
- synchronized?和?Lock?的異同點(diǎn)(如何讓選擇)
相關(guān)文章
Spring Boot 各種回滾操作實(shí)戰(zhàn)教程(自動(dòng)回滾、手動(dòng)回滾、部分回滾)
這篇文章主要介紹了Spring Boot 各種回滾操作實(shí)戰(zhàn)教程(自動(dòng)回滾、手動(dòng)回滾、部分回滾),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07關(guān)于二分法查找Java的實(shí)現(xiàn)及解析
這篇文章主要介紹了關(guān)于二分法查找Java的實(shí)現(xiàn)及解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Mybatis插件擴(kuò)展及與Spring整合原理分析
這篇文章主要介紹了Mybatis插件擴(kuò)展及與Spring整合原理,本文通過實(shí)例文字相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Springboot中使用Redis實(shí)現(xiàn)分布式鎖的示例代碼
在分布式系統(tǒng)中,為了保證數(shù)據(jù)的一致性和任務(wù)的互斥執(zhí)行,分布式鎖是一種常見的解決方案,本文主要介紹了Springboot中使用Redis實(shí)現(xiàn)分布式鎖的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05