存储过程没有执行完后没有释放锁_面试必问---synchronized实现原理及锁升级过程你懂吗?...
synchronized實現原理及鎖升級過程
前言:
synchronized是Java內置的機制,是JVM層面的,而Lock則是接口,是JDK層面的
盡管最初synchronized的性能效率比較差,但是隨著版本的升級,synchronized已經變得原來越強大了,本文帶大家了解的是synchronized實現原理及鎖升級過程,希望可以幫助到大家。
1.用法
synchronized可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多只有一個線程執行這段代碼。
synchronized有三種應用方式:
作用于實例方法,當前實例加鎖,進入同步代碼前要獲得當前實例的鎖;
作用于靜態方法,當前類加鎖,進去同步代碼前要獲得當前類對象的鎖;
作用于代碼塊,對括號里配置的對象加鎖。
2.實現原理
2.1 Java對象頭
synchronized用的鎖存在Java對象頭里,Java對象頭里的Mark Word默認存儲對象的HashCode、分代年齡和鎖標記位。在運行期間,Mark Word里存儲的數據會隨著鎖標志位的變化而變化。32位JVM的Mark Word可能變化存儲為以下5種數據:
鎖一共有四種狀態,級別從低到高依次是:無鎖狀態、偏向鎖狀態、輕量級鎖狀態和重量級鎖狀態,這幾個狀態隨著競爭情況逐漸升級。為了提高獲得鎖和釋放鎖的效率,鎖可以升級但不能降級,意味著偏向鎖升級為輕量級鎖后不能降級為偏向鎖。
1.偏向鎖
當一個線程訪問同步塊并獲取鎖時,會在對象頭和棧幀的鎖記錄里存儲偏向的線程ID,以后該線程在進入和退出同步塊時不需要進行CAS操作來加鎖和解鎖,只需測試Mark Word里線程ID是否為當前線程。如果測試成功,表示線程已經獲得了鎖。如果測試失敗,則需要判斷偏向鎖的標識。如果標識被設置為0(表示當前是無鎖狀態),則使用CAS競爭鎖;如果標識設置成1(表示當前是偏向鎖狀態),則嘗試使用CAS將對象頭的偏向鎖指向當前線程,觸發偏向鎖的撤銷。偏向鎖只有在競爭出現才會釋放鎖。當其他線程嘗試競爭偏向鎖時,程序到達全局安全點后(沒有正在執行的代碼),它會查看Java對象頭中記錄的線程是否存活,如果沒有存活,那么鎖對象被重置為無鎖狀態,其它線程可以競爭將其設置為偏向鎖;如果存活,那么立刻查找該線程的棧幀信息,如果還是需要繼續持有這個鎖對象,那么暫停當前線程,撤銷偏向鎖,升級為輕量級鎖,如果線程1不再使用該鎖對象,那么將鎖對象狀態設為無鎖狀態,重新偏向新的線程。
2.輕量級鎖
線程在執行同步塊之前,JVM會先在當前線程的棧幀中創建用于存儲鎖記錄的空間,并將對象頭的MarkWord復制到鎖記錄中,即Displaced Mark Word。然后線程會嘗試使用CAS將對象頭中的Mark Word替換為指向鎖記錄的指針。如果成功,當前線程獲得鎖。如果失敗,表示其他線程在競爭鎖,當前線程使用自旋來獲取鎖。當自旋次數達到一定次數時,鎖就會升級為重量級鎖。
輕量級鎖解鎖時,會使用CAS操作將Displaced Mark Word替換回到對象頭,如果成功,表示沒有競爭發生。如果失敗,表示當前鎖存在競爭,鎖已經被升級為重量級鎖,則會釋放鎖并喚醒等待的線程。
流程大致如下:
結束:
今天就分享到這里,有不對需要改進的地方還望大佬們指出
我在學習過程中整理了一些學習資料,可以分享給做java的工程師朋友們,相互交流學習,需要的可以私信(資料)即可免費獲取Java架構學習資料
其中覆蓋了互聯網的方方面面,期間碰到各種產品各種場景下的各種問題,很值得大家借鑒和學習,擴展自己的技術廣度和知識面。
最后記得幫作者點個關注哦
總結
以上是生活随笔為你收集整理的存储过程没有执行完后没有释放锁_面试必问---synchronized实现原理及锁升级过程你懂吗?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “成都未来40天有36天降雨”不准确 官
- 下一篇: Win11新预览版25136发布:打开“