溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么實現(xiàn)一個輕量級鎖

發(fā)布時間:2021-06-30 17:26:09 來源:億速云 閱讀:432 作者:Leah 欄目:大數據

Java中怎么實現(xiàn)一個輕量級鎖,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

當代碼進入同步塊的時候,如果同步對象沒有被鎖定,也就是Mark Word中鎖標志位為01。虛擬機首先會在當前線程的棧幀中創(chuàng)建一個名為鎖記錄的空間,用于存儲鎖對象目前的MarkWord的拷貝。下圖為拷貝后的線程堆棧和對象頭的信息。

然后,虛擬機將使用CAS操作嘗試將對象的Mark Word更新為指向Lock Record的指針。如果更新成功,那么這個線程就獲取了該對象的鎖,并且將象Mark Word的鎖標志位修改為00,這時該線程獲取的鎖就是輕量級鎖。此時線程堆棧與對象頭信息如下。

Java中怎么實現(xiàn)一個輕量級鎖

如果上述的更新操作失敗,虛擬機會先檢查對象的Mark Word是否指向當前線程的棧幀,如果是那就說明當前線程已經獲得了這個對象的鎖,那么虛擬機就可以直接執(zhí)行同步代碼塊里的代碼了。如果不是則說明這個鎖對象已經被其他線程獲得了。如果有兩個以上的線程在爭用同一個鎖時,那么虛擬機會將輕量級鎖膨脹為重量級鎖,并將鎖標志的狀態(tài)值修改為10,Mark Word中存儲的鎖指針就會修改為重量級鎖的指針,后面等待獲得鎖的線程就要進入阻塞狀態(tài)。

上述的過程是線程獲得鎖的過程。下面我們看一下線程釋放鎖的過程。線程釋放鎖也是通過CAS操作完成的。當同步代碼塊中的代碼執(zhí)行完成時,虛擬機就會檢查對象的Mark Word是否還在指向當前線程的鎖記錄,如果是,那么就用CAS操作把對象當前的Mark Word和線程中復制的Mark Word替換。如果替換成功,那么整個同步代碼塊執(zhí)行完了,也就是鎖已經釋放了。如果替換失敗,那么就說明有其它線程嘗試獲取該鎖,那么就要在釋放鎖的同時,喚醒被掛起的其它線程。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI