




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Java中synchronized鎖升級(jí)的過程目錄簡(jiǎn)介CASmarkWordSynchronized的鎖升級(jí)偏向鎖輕量級(jí)鎖重量級(jí)鎖總結(jié)
簡(jiǎn)介
在多線程中解決線程安全的問題時(shí)常用到Synchronized,現(xiàn)在的synchronized相對(duì)于早期的synchronized做出了優(yōu)化,從以前的加鎖就是重量級(jí)鎖優(yōu)化成了有一個(gè)鎖升級(jí)的過程(偏向鎖-輕量級(jí)鎖-重量級(jí)鎖)。
CAS
cas的全稱是compareandswap,從名稱上可以看出它是先比較再進(jìn)行設(shè)置,它是一種在多線程環(huán)境下實(shí)現(xiàn)同步功能的機(jī)制。
下面這段代碼是在ReentrantLock類中復(fù)制的一段關(guān)于CAS操作的代碼
protectedfinalbooleancompareAndSetState(intexpect,intupdate){
//Seebelowforintrinsicssetuptosupportthis
returnpareAndSwapInt(this,stateOffset,expect,update);
}
compareAndSwapInt的參數(shù),這里的參數(shù)一和參數(shù)二現(xiàn)在把他理解成是一個(gè)參數(shù)pareAndSwapInt(curr,expect,update);所以這一個(gè)Cas操作里面需要三個(gè)參數(shù)
參數(shù)一:當(dāng)前值參數(shù)二:期望值參數(shù)三:需要修改成的值
只有在當(dāng)前值和期望值一致的時(shí)候才會(huì)將當(dāng)前值修改成參數(shù)三所傳入的值。
CAS在JUC包中應(yīng)用很廣泛,比如在AtomicXXX類中使用到了大量的CAS操作,
CAS不是很難理解,有個(gè)概念就好。
markWord
如果了解對(duì)象的內(nèi)存布局的可以略過此段。這個(gè)對(duì)象的內(nèi)存布局是和JVM的實(shí)現(xiàn)有關(guān),本章所說的是HotSpot的實(shí)現(xiàn)。
當(dāng)一個(gè)對(duì)象被創(chuàng)建出來后它在內(nèi)存中的布局如下,由四部分組成:
8個(gè)字節(jié)的markword,(markword里面包含了其它的東西,比如GC標(biāo)記,鎖類型)4個(gè)字節(jié)的ClassPoint(此指針指向的Class),默認(rèn)是開啟指針壓縮所以是四個(gè)字節(jié),關(guān)閉指針壓縮后是八個(gè)字節(jié)實(shí)例對(duì)象中的成員屬性大小字節(jié)填充(有的JVM需要8字節(jié)對(duì)齊,如果上面的字節(jié)相加后不能被8整除,則需要在此補(bǔ)齊)
看到上面的圖,應(yīng)該可以大概的看出來synchronized加鎖,其實(shí)就是修改的對(duì)像頭里面的markword的數(shù)據(jù)。所以synchronized可以對(duì)任何一個(gè)對(duì)象加鎖
現(xiàn)在有一個(gè)Java類T,將它new出來之后它的對(duì)象的內(nèi)存布局是什么樣子的呢?
classT{
Integerage;
}
可以通過一個(gè)小工具來查看下這個(gè)T類在內(nèi)存中的對(duì)象布局
dependency
groupIdorg.openjdk.jol/groupId
artifactIdjol-core/artifactId
version0.9/version
scopecompile/scope
/dependency
通過下面的程序來打印下T對(duì)象的布局是什么樣子的。
publicstaticvoidmain(String[]args){
To=newT();
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
這張圖是一個(gè)沒有加鎖的對(duì)象的對(duì)象布局。
通過synchronized后的對(duì)象布局是什么樣子的呢?這次再修改下T類,目的是讓它存在字節(jié)填充
classT{
Integerage;
Integerage1;
publicstaticvoidmain(String[]args){
To=newT();
synchronized(o){
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
到這里可能有些小伙伴有疑問,這里為啥是輕量級(jí)鎖,不應(yīng)該先是偏向鎖嗎?原因如下:
因?yàn)槠蜴i是有4秒的延遲的,所以如果想要看到效果可以在代碼里加上sleep(4100)就可以了?;蛘呤峭ㄟ^jvm參數(shù)-XX:BiasedLockingStartupDelay=0將延遲設(shè)置成0
看完這里也對(duì)markword有了些了解了,因?yàn)樵趕ynchronized中加鎖就是通過cas的方式修改的markword中的鎖狀態(tài)
Synchronized的鎖升級(jí)
上圖大概就是Synchronized加鎖后的一個(gè)鎖升級(jí)的過程。從早期的重量級(jí)鎖優(yōu)化到了現(xiàn)在一個(gè)輕量級(jí)鎖。
偏向鎖
上面的重量級(jí)鎖說到重量級(jí)鎖想要申請(qǐng)一把鎖需要用戶態(tài)到內(nèi)核態(tài)的一個(gè)轉(zhuǎn)換,到了后期的JDK版本中,加鎖不用在去向OS去申請(qǐng)鎖了,只需要在用戶態(tài)就可以完成加鎖。
從名字上可以看出偏向鎖它就是偏向某一個(gè)線程,把這個(gè)鎖加到這個(gè)線程上,在加鎖的時(shí)候如果發(fā)現(xiàn)當(dāng)前鎖的競(jìng)爭(zhēng)線程只有一個(gè)線程的話,那么這個(gè)鎖直接偏向這個(gè)線程。直接上鎖,不存在競(jìng)爭(zhēng)。并在線程棧中創(chuàng)建一個(gè)LR(鎖記錄)并將markword拷貝到LR中,同時(shí)鎖中的markwrod中的指針也會(huì)指向當(dāng)前持有鎖線程的LR
這里的LR是有什么作用?
首先synchronized是一個(gè)可重入鎖,它即然是一個(gè)可重入鎖它就得有一個(gè)東西用來記錄重入的次數(shù)(加鎖幾次必須解鎖幾次)。在解鎖時(shí)LR在棧中彈出一個(gè)就表示解鎖一次。
當(dāng)有多個(gè)線程競(jìng)爭(zhēng)的時(shí)候會(huì)升級(jí)成輕量級(jí)鎖(自旋鎖)
通過下圖來看下偏向鎖是怎么一回事。
當(dāng)大呆需要上WC時(shí),只有它自已要上WC,此時(shí)并沒有其它的人需要上WC,那么這時(shí)這個(gè)WC可以直接給大呆使用,并且大呆把可以標(biāo)識(shí)自已身份的ID貼到門上,表示此時(shí)大呆占用了這個(gè)WC。
當(dāng)又有一個(gè)線程來搶占鎖時(shí)發(fā)現(xiàn)當(dāng)前鎖已被占用,此時(shí)鎖會(huì)從偏向鎖升級(jí)成輕量級(jí)鎖。
匿名偏向
在執(zhí)行的時(shí)候?qū)⑵蜴i的延遲設(shè)置成0-XX:BiasedLockingStartupDelay=0
publicstaticvoidmain(String[]args)throwsInterruptedException{
To=newT();
System.out.println(ClassLayout.parseInstance(o).toPrintable());
}
可以看這個(gè)程序的執(zhí)行結(jié)果,當(dāng)前的鎖狀態(tài)是偏向鎖,而有意思是的鎖存在,但是他并沒有指向線程的指針,
這種情況稱為匿名偏向。
輕量級(jí)鎖
說到輕量級(jí)鎖可能需要在兩種情況下來說它,一是在升級(jí)成輕量鎖之前有偏向鎖,另一種是在升級(jí)輕量鎖之前沒有偏向鎖,這里說完第一種第二種不用解釋各位也會(huì)明白是怎么一回事。
還是用上面這個(gè)圖來解釋,此時(shí)當(dāng)前的WC被大呆所占用,這時(shí)二呆來了也要使用WC。這時(shí)大呆和二呆就要通過CAS的方式來搶占WC。
因?yàn)榇藭r(shí)鎖的狀態(tài)是偏向鎖的狀態(tài),二呆來了也要使用WC(這時(shí)有兩個(gè)人同時(shí)要使用WC,這時(shí)就要將偏向鎖升級(jí)成輕量級(jí)鎖),在升級(jí)輕量鎖之前首先需要將WC上的標(biāo)識(shí)大呆身份的ID撕下來(這一步叫做偏向鎖的撤銷),然后能過自旋+CAS的方式兩個(gè)人來搶鎖。當(dāng)其中一個(gè)線程搶鎖成功后,會(huì)將LR貼到WC的門上,表示W(wǎng)C當(dāng)前被某個(gè)線程占用,然后另一個(gè)沒有搶到鎖的線程就一直自旋,當(dāng)自旋一定次數(shù)后升級(jí)成重量級(jí)鎖。
如果在升級(jí)輕量鎖之前沒有偏向鎖,此時(shí)兩個(gè)線程直接自旋+CAS的方式來搶鎖。
重量級(jí)鎖
在了解重量級(jí)鎖之前,我想應(yīng)該先說下用戶態(tài)與內(nèi)核態(tài):
對(duì)于系統(tǒng)而言,它可以做的一些事情,普通的應(yīng)用程序是無法完成的,比如系統(tǒng)可以干掉硬盤,如果普通的程序想要干掉硬盤它必須向操作系統(tǒng)去申請(qǐng),由此操作系統(tǒng)中的指令分了級(jí)別,操作系統(tǒng)級(jí)別可以訪問所有的指令,在用戶態(tài)下只能訪問用戶能訪問的指令,如果用戶態(tài)要訪問內(nèi)核態(tài)可以執(zhí)行的指令必須去向操作系統(tǒng)去申請(qǐng),請(qǐng)操作系統(tǒng)調(diào)用。
在JDK早期,上鎖只能上重量級(jí)鎖。因?yàn)?,所謂的JVM其實(shí)它也是工作在用戶態(tài)的一個(gè)進(jìn)程,如果想要對(duì)一個(gè)對(duì)象進(jìn)行上鎖,那它必須去向系統(tǒng)去申請(qǐng)鎖。申請(qǐng)鎖成功后,還需要將這把鎖從內(nèi)核態(tài)返回到用戶態(tài),它稱為重量級(jí)鎖的原因就是在鎖申請(qǐng)的時(shí)候都要有一個(gè)在用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)換。
當(dāng)搶占到鎖后,markword里面記錄的不再是LR的指針,而是指向的是一個(gè)C++的對(duì)象ObjectMonitor,
如果當(dāng)前線程自旋一段時(shí)間后沒有搶到鎖就會(huì)升級(jí)成重量級(jí)鎖,并將當(dāng)前的線程存入EntryList隊(duì)列中阻塞,持有鎖的線程執(zhí)行完成后,在喚醒EntryList隊(duì)列中的線程去搶占鎖。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)氨基酸類表面活性劑行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭(zhēng)格局與投資發(fā)展研究報(bào)告
- 2025-2030年中國(guó)氣瓶柜行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)模塊電源行業(yè)市場(chǎng)發(fā)展現(xiàn)狀及商業(yè)模式與投資發(fā)展研究報(bào)告
- 2025-2030年中國(guó)植物纖維素纖維行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)棉襪行業(yè)市場(chǎng)發(fā)展分析及前景預(yù)測(cè)與投資發(fā)展戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)樹樁粉碎機(jī)行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030年中國(guó)枕袋軟包裝行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 行政法學(xué)的研究目標(biāo)與方法探討試題及答案
- 2025-2030年中國(guó)木制鉛筆行業(yè)市場(chǎng)深度調(diào)研及競(jìng)爭(zhēng)格局與投資前景研究報(bào)告
- 2025-2030年中國(guó)智能防盜門行業(yè)市場(chǎng)深度調(diào)研及競(jìng)爭(zhēng)格局與投資研究報(bào)告
- 2025年水利工程師職稱考試試題及答案
- 2025年四川省成都市青羊區(qū)中考數(shù)學(xué)二診試卷
- 法院出庭授權(quán)委托書
- 2025年山東出版集團(tuán)有限公司山東出版?zhèn)髅焦煞萦邢薰菊衅?192名)筆試參考題庫附帶答案詳解
- 2025年四川省宜賓市第二中學(xué)校九年級(jí)二診考試數(shù)學(xué)試題(原卷版+解析版)
- 《會(huì)計(jì)基礎(chǔ)與實(shí)務(wù)》課件-項(xiàng)目五 登記會(huì)計(jì)賬簿
- 2024初級(jí)注冊(cè)安全工程師筆試題庫答案分析
- 高房子與矮房子的比較與思考
- 2025年時(shí)事政治考題及參考答案(350題)
- 學(xué)生活動(dòng)場(chǎng)地借用流程
- 江西省醫(yī)療機(jī)構(gòu)管理?xiàng)l例實(shí)施辦法(暫行)
評(píng)論
0/150
提交評(píng)論