synchronized原理及1.6之后的鎖升級(jí)優(yōu)化

偏向所鎖,輕量級(jí)鎖及重量級(jí)鎖

偏向所鎖,輕量級(jí)鎖都是樂(lè)觀鎖,重量級(jí)鎖是悲觀鎖。

一個(gè)對(duì)象剛開(kāi)始實(shí)例化的時(shí)候,沒(méi)有任何線程來(lái)訪問(wèn)它的時(shí)候。它是可偏向的,意味著,它現(xiàn)在認(rèn)為只可能有一個(gè)線程來(lái)訪問(wèn)它,所以當(dāng)?shù)谝粋€(gè)

線程來(lái)訪問(wèn)它的時(shí)候,它會(huì)偏向這個(gè)線程,此時(shí),對(duì)象持有偏向鎖。偏向第一個(gè)線程,這個(gè)線程在修改對(duì)象頭成為偏向鎖的時(shí)候使用CAS操作,并將

對(duì)象頭中的ThreadID改成自己的ID,之后再次訪問(wèn)這個(gè)對(duì)象時(shí),只需要對(duì)比ID,不需要再使用CAS在進(jìn)行操作。

一旦有第二個(gè)線程訪問(wèn)這個(gè)對(duì)象,因?yàn)槠蜴i不會(huì)主動(dòng)釋放,所以第二個(gè)線程可以看到對(duì)象時(shí)偏向狀態(tài),這時(shí)表明在這個(gè)對(duì)象上已經(jīng)存在競(jìng)爭(zhēng)了,檢查原來(lái)持有該對(duì)象鎖的線程是否依然存活,如果掛了,則可以將對(duì)象變?yōu)闊o(wú)鎖狀態(tài),然后重新偏向新的線程,如果原來(lái)的線程依然存活,則馬上執(zhí)行那個(gè)線程的操作棧,檢查該對(duì)象的使用情況,如果仍然需要持有偏向鎖,則偏向鎖升級(jí)為輕量級(jí)鎖,(偏向鎖就是這個(gè)時(shí)候升級(jí)為輕量級(jí)鎖的)。如果不存在使用了,則可以將對(duì)象回復(fù)成無(wú)鎖狀態(tài),然后重新偏向。

輕量級(jí)鎖認(rèn)為競(jìng)爭(zhēng)存在,但是競(jìng)爭(zhēng)的程度很輕,一般兩個(gè)線程對(duì)于同一個(gè)鎖的操作都會(huì)錯(cuò)開(kāi),或者說(shuō)稍微等待一下(自旋),另一個(gè)線程就會(huì)釋放鎖。 但是當(dāng)自旋超過(guò)一定的次數(shù),或者一個(gè)線程在持有鎖,一個(gè)在自旋,又有第三個(gè)來(lái)訪時(shí),輕量級(jí)鎖膨脹為重量級(jí)鎖,重量級(jí)鎖使除了擁有鎖的線程以外的線程都阻塞,防止CPU空轉(zhuǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容