Java 偏斜锁 轻量级锁 自环锁 重量级锁
Java中所謂鎖的升級降級,其實是JVM對Synchronized的優化,JVM當檢測到線程不同的競爭狀態時,會自動切換到不同的的鎖的實現,這種切換就是鎖的降級和升級。
偏斜鎖: 當競爭不激烈的時候,會默認使用偏斜鎖。 對象鎖的對象內存中在開頭的幾個保留信息,叫做Mark Word, 經前人大量研究,大多數情況下鎖不僅不存在多個線程競爭,而且總是由同一個線程獲得。所以當一個線程來到同步塊獲取鎖時,為了減少加鎖和減鎖的性能損耗,會在Mark Word中保存這個使用這個鎖的線程的ID。 如果這個線程再次請求這個對象鎖,那么只需要讀取該對象鎖的Mark Word的偏向鎖信息,也就是上次保留的線程ID進行對比,如果是同一個線程,就認為獲得偏向鎖成功,而不需要進行真正的加解鎖操作。 其實意思是就是上次你來過了,這次又來了,并且當中沒有別人來,對于你這個線程來說,鎖對象的資源隨便用都是安全,這是用緩存來換取性能的做法。偏向鎖在競爭不激烈的情況下有較高的性能。當另外一個線程過來需要競爭鎖時,虛擬機會首先暫停持有偏向鎖的線程,然后檢查是否還在同步塊內,如果不在同步快內,則偏向其他線程,否則升級成為輕量級鎖。
輕量級鎖: 如果某個線程試圖鎖定某個已經被偏斜的對象,JVM就需要撤銷偏向鎖,升級成為輕量鎖。如果獲取失敗,則進入自旋鎖,如果自旋到一定的次數還是不能得到鎖,就進入重量鎖。
自環鎖: 線程獲取鎖失敗后,為了避免讓線程進入阻塞狀態而采取的循環一定次數去試著獲取鎖的行為。因為線程進出阻塞狀態涉及從用戶太進入到內核態,非常的消耗資源。并且實驗證明一般情況下一個線程持有鎖的時間是非常短的,所以一般的多次嘗試就能獲取得鎖。 因為線程在循環,所以非常的消耗CPC。循環一定的次數也是應該讓出CPU進入阻塞狀態的
重量鎖: 就是Java一開始對Synchronized實現的阻塞鎖。一旦到了重量級鎖的話,其他的線程都會被阻塞等待獲得鎖
其中CAS的全稱是Compare And Swap,意思是比較交換,執行函數式cas(V,E,N),其中包含三個參數,V表示要更新的變量,E表示期望的值,N表是要更新的值。 如果V和E相等,則表明還沒有其他的線程來更改過這值,則將N的值賦值給V,如果不相等,則說明已經有其他的線程來過了,不做任何修改。CAS是CPC層級的院子系操作指令。
總結
以上是生活随笔為你收集整理的Java 偏斜锁 轻量级锁 自环锁 重量级锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL忘记密码怎么办
- 下一篇: java se7 if_Java SE7