Java中synchronized關鍵字的使用和原理詳解
實現(xiàn)原理
- JVM 是通過進入、退出 對象監(jiān)視器(Monitor) 來實現(xiàn)對方法、同步塊的同步的,而對象監(jiān)視器的本質依賴于底層操作系統(tǒng)的 互斥鎖(Mutex Lock) 實現(xiàn)。
- 具體實現(xiàn)是在編譯之后在同步方法調用前加入一個monitor.enter指令,在退出方法和異常處插入monitor.exit的指令。
- 對于沒有獲取到鎖的線程將會阻塞到方法入口處,直到獲取鎖的線程monitor.exit之后才能嘗試繼續(xù)獲取鎖。
有三種使用方式:
- 修飾同步代碼塊,其作用的范圍是大括號{}括起來的代碼,作用的對象是調用這個代碼塊的對象。
- 修飾普通方法,即同步方法,其作用的范圍是整個方法,作用的對象是調用這個方法的對象。
- 修飾靜態(tài)方法,其作用的范圍是整個靜態(tài)方法,作用的對象是這個類的所有對象。
synchronized修飾同步代碼塊
在同步代碼塊的入口和出口分別有monitorenter和monitorexit指令。當執(zhí)行monitorenter指令時,線程試圖獲取鎖也就是獲取monitor(monitor對象存在于每個Java對象的對象頭中,synchronized鎖便是通過這種方式獲取鎖的) 兩個monitorexit確保發(fā)生異常時也能釋放鎖
synchronized修飾普通方法
在synchronized修飾普通方法時是添加ACC_SYNCHRONIZED標識,該標識指明了該方法是一個同步方法,JVM通過該ACC_SYNCHRONIZED訪問標志來辨別一個方法是否聲明為同步方法,從而執(zhí)行相應的同步調用。
synchronized修飾靜態(tài)方法
訪問標識為ACC_STATIC , ACC_SYNCHRONIZED
到此這篇關于Java中synchronized關鍵字的使用和原理詳解的文章就介紹到這了,更多相關synchronized的使用和原理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot如何優(yōu)雅的實現(xiàn)重試功能
這篇文章主要詳細介紹了SpringBoot如何優(yōu)雅的實現(xiàn)重試功能的步驟詳解,文中有詳細的代碼示例,具有一定的參考價值,感興趣的同學可以借鑒閱讀2023-06-06Springboot整合WebSocket實戰(zhàn)教程
WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據,這篇文章主要介紹了Springboot整合WebSocket實戰(zhàn)教程,需要的朋友可以參考下2023-05-05