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