java虛擬機--鎖優化

CAS:Compare and Swap 即:比較并交換

CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什么都不做。

java中的封裝結構


java存儲空間

總述:虛擬機為了在線程之間更高效的共享數據,以及解決競爭問題采用了一下幾種鎖優化技術:適應性自旋、鎖消除、鎖粗化、輕量級鎖、偏向鎖

一、自旋鎖

定義:由于掛起和恢復線程都是要轉入內核態中完成的,會對并發性能帶來很多壓力。所以當鎖定狀態持續時間很短的時候沒有必要去掛起和恢復線程,只需要讓線程執行一個忙循環(自旋),就是讓線程“稍等一下”。這項技術就是自旋鎖。

使用方式:參數-XX:+UseSpinning 開啟?

? ? ? ? ? ? ? ? ? ?默認自旋次數是10次,可以通過參數-XX:PreBlockSpin 更改

二、自適應自旋鎖(jdk1.6+)

定義:在自旋鎖基礎上,自旋的時間不再是固定的。而是對前一次在同一個鎖上的自旋時間及鎖的擁有者狀態來判斷:

1.當前一次自旋時間越短,且持有鎖的線程正在運行,則自適應時間越長

2.反之,自旋很少成功的,則省略自旋過程,以免浪費處理器資源。

三、鎖消除

定義:在編譯器運行時,對于一些代碼上要求同步,但是被檢測到不可能存在共享數據競爭的鎖進行清除。

依據:逃逸分析。即當堆上的所有數據都不會逃逸出去從而被其他線程訪問到,那就當成棧上數據對待。

ps:很多時候并不是代碼中的寫入同步,是在編譯器中自動加入的

四、粗化鎖

定義:對于同一個對象反復加鎖解鎖時,將同步范圍擴展(粗化)到整個序列外部。

五、輕量級鎖

定義:在無競爭情況下,使用CAS操作去消除同步使用的互斥量。

對象頭

加鎖過程:

1.棧幀對Mark Word標志位為01的對象,建立一個鎖記錄(Lock Record)的空間。

2.虛擬機將使用CAS將對象的Mrak Word 更新指向Lock Record ,如果結果

? ? ? ? ? ?-成功:將標志位變為00,處于輕量級鎖。

? ? ? ? ? ?-失敗:且線程沒有該對象鎖,標志位變為10,膨脹為重量級鎖。

六、偏向鎖

定義:在無競爭情況下,將整個同步都消除掉。如果沒有被其他線程獲取,則永遠不需要再進行同步。

適用場景:帶有同步但無競爭場景

啟用偏向鎖參數:-XX:+UseBiasedLocking

禁止偏向鎖參數:-XX:-UseBiasedLocking

使用過程:

當鎖對象第一次被獲取時,虛擬機將標志位置為01,偏向模式。并CAS把獲取到這個鎖的線程的ID記錄在對象的Mark Word之中。

一旦有另外一個線程去嘗試獲取這個鎖,偏向模式結束。根據對象是否處于鎖定狀態,分別恢復為輕量級鎖(00)和未鎖定(01)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容