Java中怎么實(shí)現(xiàn)一個(gè)輕量級(jí)鎖,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
公司主營(yíng)業(yè)務(wù):網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出哈密免費(fèi)做網(wǎng)站回饋大家。
當(dāng)代碼進(jìn)入同步塊的時(shí)候,如果同步對(duì)象沒(méi)有被鎖定,也就是Mark Word中鎖標(biāo)志位為01。虛擬機(jī)首先會(huì)在當(dāng)前線程的棧幀中創(chuàng)建一個(gè)名為鎖記錄的空間,用于存儲(chǔ)鎖對(duì)象目前的MarkWord的拷貝。下圖為拷貝后的線程堆棧和對(duì)象頭的信息。
然后,虛擬機(jī)將使用CAS操作嘗試將對(duì)象的Mark Word更新為指向Lock Record的指針。如果更新成功,那么這個(gè)線程就獲取了該對(duì)象的鎖,并且將象Mark Word的鎖標(biāo)志位修改為00,這時(shí)該線程獲取的鎖就是輕量級(jí)鎖。此時(shí)線程堆棧與對(duì)象頭信息如下。
如果上述的更新操作失敗,虛擬機(jī)會(huì)先檢查對(duì)象的Mark Word是否指向當(dāng)前線程的棧幀,如果是那就說(shuō)明當(dāng)前線程已經(jīng)獲得了這個(gè)對(duì)象的鎖,那么虛擬機(jī)就可以直接執(zhí)行同步代碼塊里的代碼了。如果不是則說(shuō)明這個(gè)鎖對(duì)象已經(jīng)被其他線程獲得了。如果有兩個(gè)以上的線程在爭(zhēng)用同一個(gè)鎖時(shí),那么虛擬機(jī)會(huì)將輕量級(jí)鎖膨脹為重量級(jí)鎖,并將鎖標(biāo)志的狀態(tài)值修改為10,Mark Word中存儲(chǔ)的鎖指針就會(huì)修改為重量級(jí)鎖的指針,后面等待獲得鎖的線程就要進(jìn)入阻塞狀態(tài)。
上述的過(guò)程是線程獲得鎖的過(guò)程。下面我們看一下線程釋放鎖的過(guò)程。線程釋放鎖也是通過(guò)CAS操作完成的。當(dāng)同步代碼塊中的代碼執(zhí)行完成時(shí),虛擬機(jī)就會(huì)檢查對(duì)象的Mark Word是否還在指向當(dāng)前線程的鎖記錄,如果是,那么就用CAS操作把對(duì)象當(dāng)前的Mark Word和線程中復(fù)制的Mark Word替換。如果替換成功,那么整個(gè)同步代碼塊執(zhí)行完了,也就是鎖已經(jīng)釋放了。如果替換失敗,那么就說(shuō)明有其它線程嘗試獲取該鎖,那么就要在釋放鎖的同時(shí),喚醒被掛起的其它線程。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。