淺談Java中Lock和Synchronized的區(qū)別
1. 從功能角度來(lái)看
Lock
和Synchronized
都是java中去用來(lái)解決線(xiàn)程安全問(wèn)題的一個(gè)工具
2. 從特性來(lái)看
Synchronized
是java中的同步關(guān)鍵字,Lock是J.U.C
包中提供的接口,而這個(gè)接口有很多的實(shí)現(xiàn)類(lèi),包括ReentrantLock
這樣重入鎖的實(shí)現(xiàn),Synchronized
可以通過(guò)兩種方式去控制鎖的力度
一種把synchronized
關(guān)鍵字修飾在方法層面,另一種是修飾在代碼塊上,可以通過(guò)synchronized
加鎖對(duì)象的生命周期,來(lái)控制鎖的作用范圍,鎖對(duì)象是靜態(tài)對(duì)象或者是類(lèi)對(duì)象,那么這個(gè)鎖就是屬于全局鎖,如果鎖對(duì)象是普通實(shí)例對(duì)象,那么這個(gè)鎖的范圍取決于這個(gè)實(shí)例的生命周期,Lock中鎖的粒度是通過(guò)它里面提供的lock()
方法和unlock()
方法來(lái)決定的
如上圖:在lock()方法和unlock()
方法之間的代碼,是能夠保證線(xiàn)程安全的,而鎖的作用域 取決于Lock實(shí)例的生命周期。Lock比Synchronized
的靈活性更高,Lock可以自主的去決定什么時(shí)候加鎖,什么時(shí)候釋放鎖,只需要調(diào)用lock()
和unlock
這兩個(gè)方法就可以了,Lock還提供了非阻塞的競(jìng)爭(zhēng)鎖的方法,叫tryLock()
,這個(gè)方法可以通過(guò)返回true/false
來(lái)告訴當(dāng)前線(xiàn)程是否已經(jīng)有其他線(xiàn)程正在使用鎖,而Synchronized由于是關(guān)鍵字,所以它無(wú)法去實(shí)現(xiàn)非阻塞競(jìng)爭(zhēng)鎖的方法,Synchroized
鎖的釋放是被動(dòng)的,當(dāng)Synchronized
同步代碼塊,執(zhí)行結(jié)束以后,或者代碼出現(xiàn)異常的時(shí)候才會(huì)被釋放,Lock提供了公平鎖和非公平鎖的機(jī)制,公平鎖是指線(xiàn)程競(jìng)爭(zhēng)鎖資源的時(shí)候,已經(jīng)有其它線(xiàn)程正在排隊(duì),或者等待鎖釋放,那么當(dāng)前競(jìng)爭(zhēng)鎖的線(xiàn)程,是無(wú)法去插隊(duì)的,非公平鎖就是不管是否有線(xiàn)程在排隊(duì)等待鎖,它都會(huì)去嘗試去競(jìng)爭(zhēng)一次鎖,Synchronized
只提供方了一種非公平鎖的實(shí)現(xiàn)。
3. 從性能方面來(lái)看
Synchronized
和lock在性能方面相差不大,在實(shí)現(xiàn)上會(huì)有一定的區(qū)別,Synchronized
引入了偏向鎖,輕量級(jí)鎖,重量級(jí)鎖以及鎖升級(jí)的機(jī)制來(lái)實(shí)現(xiàn)鎖的優(yōu)化,而Lock中則用到了自旋鎖的方式去實(shí)現(xiàn)性能優(yōu)化
到此這篇關(guān)于淺談Java中Lock
和Synchronized
的區(qū)別的文章就介紹到這了,更多相關(guān)Lock
和Synchronized
的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深度優(yōu)先與廣度優(yōu)先Java實(shí)現(xiàn)代碼示例
這篇文章主要介紹了深度優(yōu)先與廣度優(yōu)先Java實(shí)現(xiàn)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12mybatis-plus IdWorker生成的Id和返回給前臺(tái)的不一致的解決
這篇文章主要介紹了mybatis-plus IdWorker生成的Id和返回給前臺(tái)的不一致的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03解析使用jdbc,hibernate處理clob/blob字段的詳解
本篇是對(duì)使用jdbc,hibernate處理clob/blob字段進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05springboot配置允許循環(huán)依賴(lài)問(wèn)題
這篇文章主要介紹了springboot配置允許循環(huán)依賴(lài)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Java使用正則表達(dá)式實(shí)現(xiàn)找出數(shù)字功能示例
這篇文章主要介紹了Java使用正則表達(dá)式實(shí)現(xiàn)找出數(shù)字功能,結(jié)合實(shí)例形式分析了Java針對(duì)數(shù)字的匹配查找及非數(shù)字替換操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03java實(shí)現(xiàn)簡(jiǎn)單斗地主(看牌排序)
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單斗地主,看牌進(jìn)行排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2010-11-11Spring AOP失效的常見(jiàn)場(chǎng)景分析
Spring的AOP(面向切面編程)是一種強(qiáng)大的技術(shù),用于在應(yīng)用程序中實(shí)現(xiàn)橫切關(guān)注點(diǎn)的模塊化,雖然Spring的AOP在大多數(shù)情況下都是有效的,但在某些場(chǎng)景下可能會(huì)失效,下面來(lái)分析Spring AOP失效的常見(jiàn)場(chǎng)景,需要的朋友可以參考下2024-01-01