Java中Synchronized和Static?Synchronized的區(qū)別及說(shuō)明
Synchronized和Static Synchronized的區(qū)別
synchronized 是對(duì)類的當(dāng)前實(shí)例進(jìn)行加鎖,防止其他線程同時(shí)訪問(wèn)該類的該實(shí)例的所有synchronized塊,注意這里是 “類的當(dāng)前實(shí)例” , 類的兩個(gè)不同實(shí)例就沒(méi)有這種約束了。
那么 static synchronized 恰好就是要控制類的所有實(shí)例的訪問(wèn)了, static synchronized 是限制線程同時(shí)訪問(wèn)jvm中該類的所有實(shí)例同時(shí)訪問(wèn)對(duì)應(yīng)的代碼塊。
一個(gè)日本作者-結(jié)成浩的《java多線程設(shè)計(jì)模式》
一個(gè)列子
pulbic class Something(){
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}那么,加入有Something類的兩個(gè)實(shí)例a與b
下列組方法何以被1個(gè)以上線程同時(shí)訪問(wèn)呢
a. x.isSyncA()與x.isSyncB() b. x.isSyncA()與y.isSyncA() c. x.cSyncA()與y.cSyncB() d. x.isSyncA()與Something.cSyncA()
- a . 都是對(duì)同一個(gè)實(shí)例的synchronized域訪問(wèn),因此不能被同時(shí)訪問(wèn)
- b . 是針對(duì)不同實(shí)例的,因此可以同時(shí)被訪問(wèn)
- c . 因?yàn)槭?code>static synchronized,所以不同實(shí)例之間仍然會(huì)被限制,相當(dāng)于
Something.isSyncA()與Something.isSyncB()了,因此不能被同時(shí)訪問(wèn)。 - d . 可以被同時(shí)訪問(wèn)的,理由是synchronzied的是實(shí)例方法與synchronzied的類方法由于鎖定(lock)不同的原因。
說(shuō)下結(jié)論:
- A: synchronized static是某個(gè)類的范圍,synchronized static cSync{}防止多個(gè)線程同時(shí)訪問(wèn)這個(gè) 類中的synchronized static 方法。它可以對(duì)類的所有對(duì)象實(shí)例起作用。
- B: synchronized 是某實(shí)例的范圍,synchronized isSync(){}防止多個(gè)線程同時(shí)訪問(wèn)這個(gè)實(shí)例中的synchronized 方法。
總結(jié)
有如下幾點(diǎn):
- 對(duì)象鎖鑰匙只能有一把才能互斥,才能保證共享變量的唯一性
- 在靜態(tài)方法上的鎖,和 實(shí)例方法上的鎖,默認(rèn)不是同樣的,如果同步需要制定兩把鎖一樣。
- 關(guān)于同一個(gè)類的方法上的鎖,來(lái)自于調(diào)用該方法的對(duì)象,如果調(diào)用該方法的對(duì)象是相同的,那么鎖必然相同,否則就不相同。比如
new A().x()和new A().x(),對(duì)象不同,鎖不同,如果A的單利的,就能互斥。 - 靜態(tài)方法加鎖,能和所有其他靜態(tài)方法加鎖的 進(jìn)行互斥。
- 靜態(tài)方法加鎖,和xx.class 鎖效果一樣,直接屬于類的。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用Mybatis-Plus中分頁(yè)插件PaginationInterceptor詳解
文章介紹SpringBoot高版本中使用MyBatisPlusInterceptor替代舊分頁(yè)插件,需配置多個(gè)InnerInterceptor功能模塊(如分頁(yè)、多租戶、動(dòng)態(tài)表名等),并強(qiáng)調(diào)插件順序和mapper.xml中SQL語(yǔ)句不能以分號(hào)結(jié)尾,以避免分頁(yè)語(yǔ)法錯(cuò)誤2025-07-07
Mybatis分頁(yè)的實(shí)現(xiàn)及使用注解開(kāi)發(fā)操作
這篇文章主要介紹了Mybatis分頁(yè)的實(shí)現(xiàn)及使用注解開(kāi)發(fā)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java實(shí)現(xiàn)水仙花數(shù)的計(jì)算
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)水仙花數(shù)的計(jì)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Java并發(fā)編程包中atomic的實(shí)現(xiàn)原理示例詳解
這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程包中atomic的實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
用Java打造簡(jiǎn)易計(jì)算器的實(shí)現(xiàn)步驟
這篇文章主要介紹了如何設(shè)計(jì)和實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Java命令行計(jì)算器程序,該程序能夠執(zhí)行基本的數(shù)學(xué)運(yùn)算(加、減、乘、除),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
java的Map集合中按value值進(jìn)行排序輸出的實(shí)例代碼
下面小編就為大家?guī)?lái)一篇java的Map集合中按value值進(jìn)行排序輸出的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
Spring定時(shí)任務(wù)@Scheduled注解(cron表達(dá)式fixedRate?fixedDelay)
這篇文章主要為大家介紹了Spring定時(shí)任務(wù)@Scheduled注解(cron表達(dá)式fixedRate?fixedDelay)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

