一粒梦、synchronized的底層原理
jdk6之前是互斥的死鎖,即后續(xù)的線程會(huì)進(jìn)入阻塞(系統(tǒng)調(diào)用切換線程導(dǎo)致性能降低)同辣,jdk6之后鎖優(yōu)化
有了偏向鎖拷姿、輕量級(jí)鎖惭载、重量級(jí)鎖、跌前,由偏向鎖逐步升級(jí)優(yōu)化同步棕兼。
1陡舅、偏向鎖
對(duì)象頭(存著兩部分內(nèi)容)1抵乓、存著運(yùn)行時(shí)的數(shù)據(jù)結(jié)構(gòu) 2、存著方法區(qū)中對(duì)象的類型數(shù)據(jù)指針
當(dāng)有線程訪問(wèn)鎖時(shí)靶衍,鎖的threadid會(huì)cas的操作嘗試將線程的id記錄到自己的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)中灾炭,一旦cas操作成功則
虛擬機(jī)不再進(jìn)行任何同步操作。cas操作不成功則說(shuō)明有線程和它爭(zhēng)搶鎖則升級(jí)為輕量級(jí)鎖颅眶。
2蜈出、輕量級(jí)鎖
在線程的棧幀中建立一個(gè)鎖的空間,cas的操作去鎖的對(duì)象頭中更新運(yùn)行時(shí)數(shù)據(jù)到棧幀中的鎖的空間涛酗,一旦操作成功則進(jìn)行同步代碼塊操作铡原,沒(méi)有成功則說(shuō)明有線程和它競(jìng)爭(zhēng)。則檢查對(duì)象頭中的運(yùn)行時(shí)數(shù)據(jù)是否指向當(dāng)前棧幀商叹。如果是則表明已經(jīng)獲得鎖執(zhí)行同步操作燕刻。
3、重量級(jí)鎖
互斥鎖剖笙,即為死鎖卵洗,后續(xù)的線程都會(huì)進(jìn)入阻塞狀態(tài)。
二弥咪、synchronized如何保證可見(jiàn)性的
因?yàn)閟ychronized保證共享變量每次只有一個(gè)線程進(jìn)行操縱过蹂,保證對(duì)共享變量的原子性。也就保證了共享變量的可見(jiàn)性聚至。