什么是synchronized?
一、synchronized含義
synchronized是Java語(yǔ)言的關(guān)鍵字,可用來給對(duì)象和方法或者代碼塊加鎖,當(dāng)它鎖定一個(gè)方法或者一個(gè)代碼塊的時(shí)候,同一時(shí)刻非常多只有一個(gè)線程執(zhí)行這段代碼。當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)加鎖同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。然而,當(dāng)一個(gè)線程訪問object的一個(gè)加鎖代碼塊時(shí),另一個(gè)線程仍可以訪問該object中的非加鎖代碼塊。
synchronized的作用是保證在同一時(shí)刻, 被修飾的代碼塊或方法只會(huì)有一個(gè)線程執(zhí)行,以達(dá)到保證并發(fā)安全的效果。synchronized是Java中解決并發(fā)問題的一種最常用的方法,也是最簡(jiǎn)單的一種方法。在JDK1.5之前synchronized是一個(gè)重量級(jí)鎖,相對(duì)于j.u.c.Lock,它會(huì)顯得那么笨重,隨著Javs SE 1.6對(duì)synchronized進(jìn)行的各種優(yōu)化后,synchronized并不會(huì)顯得那么重了。
二、synchronized的作用
1、原子性
所謂原子性就是指一個(gè)操作或者多個(gè)操作,要么全部執(zhí)行并且執(zhí)行的過程不會(huì)被任何因素打斷,要么就都不執(zhí)行。被synchronized修飾的類或?qū)ο蟮乃胁僮鞫际窃拥模驗(yàn)樵趫?zhí)行操作之前必須先獲得類或?qū)ο蟮逆i,直到執(zhí)行完才能釋放。
2、可見性
可見性是指多個(gè)線程訪問一個(gè)資源時(shí),該資源的狀態(tài)、值信息等對(duì)于其他線程都是可見的。synchronized和volatile都具有可見性,其中synchronized對(duì)一個(gè)類或?qū)ο蠹渔i時(shí),一個(gè)線程如果要訪問該類或?qū)ο蟊仨毾全@得它的鎖,而這個(gè)鎖的狀態(tài)對(duì)于其他任何線程都是可見的,并且在釋放鎖之前會(huì)將對(duì)變量的修改刷新到共享內(nèi)存當(dāng)中,保證資源變量的可見性。
3、有序性
有序性值程序執(zhí)行的順序按照代碼先后執(zhí)行。 synchronized和volatile都具有有序性,Java允許編譯器和處理器對(duì)指令進(jìn)行重排,但是指令重排并不會(huì)影響單線程的順序,它影響的是多線程并發(fā)執(zhí)行的順序性。synchronized保證了每個(gè)時(shí)刻都只有一個(gè)線程訪問同步代碼塊,也就確定了線程執(zhí)行同步代碼塊是分先后順序的,保證了有序性。
三、synchronized的使用
1、修飾實(shí)例方法
作用于當(dāng)前對(duì)象實(shí)例加鎖,進(jìn)入同步代碼前要獲得當(dāng)前對(duì)象實(shí)例的鎖:
synchronized void method() { //業(yè)務(wù)代碼}
2、修飾靜態(tài)方法
即給當(dāng)前類加鎖,會(huì)作用于類的所有對(duì)象實(shí)例 ,進(jìn)入同步代碼前要獲得 當(dāng)前 class 的鎖。因?yàn)殪o態(tài)成員不屬于任何一個(gè)實(shí)例對(duì)象,是類成員( static 表明這是該類的一個(gè)靜態(tài)資源,不管 new 了多少個(gè)對(duì)象,只有一份)。所以,如果一個(gè)線程 A 調(diào)用一個(gè)實(shí)例對(duì)象的非靜態(tài) synchronized 方法,而線程 B 需要調(diào)用這個(gè)實(shí)例對(duì)象所屬類的靜態(tài) synchronized 方法,是允許的,不會(huì)發(fā)生互斥現(xiàn)象,因?yàn)樵L問靜態(tài) synchronized 方法占用的鎖是當(dāng)前類的鎖,而訪問非靜態(tài) synchronized 方法占用的鎖是當(dāng)前實(shí)例對(duì)象鎖:
synchronized void staic method() { //業(yè)務(wù)代碼}
3、修飾代碼塊
指定加鎖對(duì)象,對(duì)給定對(duì)象/類加鎖。synchronized(this|object) 表示進(jìn)入同步代碼庫(kù)前要獲得給定對(duì)象的鎖。synchronized(類.class) 表示進(jìn)入同步代碼前要獲得當(dāng)前 class 的鎖:
synchronized(this) { //業(yè)務(wù)代碼}
延伸閱讀1:synchronized 鎖的升級(jí)順序
鎖主要存在四種狀態(tài),依次是:無鎖狀態(tài)、偏向鎖狀態(tài)、輕量級(jí)鎖狀態(tài)、重量級(jí)鎖狀態(tài),鎖可以從偏向鎖升級(jí)到輕量級(jí)鎖,再升級(jí)的重量級(jí)鎖。但是鎖的升級(jí)是單向的,也就是說只能從低到高升級(jí),不會(huì)出現(xiàn)鎖的降級(jí)。而且這個(gè)過程就是開銷逐漸加大的過程。

相關(guān)推薦HOT
更多>>
在 iPad 上運(yùn)行 Windows 是什么體驗(yàn)?
一、在 iPad 上運(yùn)行 Windows 是什么體驗(yàn)?zāi)壳笆忻嫔嫌幸恍┠軌蛟?iPad 上運(yùn)行 Windows 的應(yīng)用程序,例如 Parallels Access、Splash較好、VMware ...詳情>>
2023-10-14 19:14:27
vector, list, map等容器使用場(chǎng)合是什么?
一、vector, list, map等容器使用場(chǎng)合vector適用于對(duì)象簡(jiǎn)單,變化較小,并且頻繁隨機(jī)訪問的場(chǎng)景。list適用經(jīng)常進(jìn)行插入和刪除并且不經(jīng)常隨機(jī)訪...詳情>>
2023-10-14 14:59:11
分庫(kù)分表的數(shù)據(jù)庫(kù)和分布式數(shù)據(jù)庫(kù)有什么區(qū)別?
一、分庫(kù)分表的數(shù)據(jù)庫(kù)和分布式數(shù)據(jù)庫(kù)有什么區(qū)別分庫(kù)分表的數(shù)據(jù)庫(kù):沒有這種數(shù)據(jù)庫(kù),所謂分庫(kù)分表,這是開發(fā)應(yīng)用的程序員通過自己的代碼、或者底...詳情>>
2023-10-14 13:59:18
APP定制開發(fā)的難點(diǎn)有哪些?
一、APP定制開發(fā)的難點(diǎn)1、多平臺(tái)適配不同的移動(dòng)平臺(tái)(如iOS和Android)具有不同的操作系統(tǒng)、開發(fā)語(yǔ)言和開發(fā)工具。在進(jìn)行APP定制開發(fā)時(shí),需要適...詳情>>
2023-10-14 12:57:35熱門推薦
TIM和QQ的區(qū)別?
沸linux系統(tǒng)中的安全設(shè)置有哪些?
熱golp是什么設(shè)備?
熱excel中的數(shù)據(jù)分析方法有哪些?
新Hbase適合存哪些數(shù)據(jù)?
高級(jí)程序設(shè)計(jì)語(yǔ)言的特點(diǎn)是什么?
路由器和交換機(jī)的區(qū)別?
什么是采購(gòu)管理?
什么是聊天機(jī)器人?
什么是ai算法?
app的啟動(dòng)流程都包括哪些步驟?
MySQL數(shù)據(jù)庫(kù)全局隔離級(jí)別和默認(rèn)隔離級(jí)別有什么區(qū)別?
在 iPad 上運(yùn)行 Windows 是什么體驗(yàn)?
Python代碼中的yield到底是什么?
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動(dòng)
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開班地區(qū)
查看來校路線