原生鎖優(yōu)化

前言

高效并發(fā)是從JDK1.5到JDK1.6的一個重要改進,Java開發(fā)者團隊在這個版本上花費了大量的精力去實現(xiàn)各種鎖優(yōu)化技術(shù),如適應(yīng)性自旋、鎖消除、鎖粗化、輕量級鎖和偏向鎖等。這些技術(shù)都是為了在線程之間更高效地共享數(shù)據(jù),以及解決競爭問題,從而提高程序的執(zhí)行效率。

自旋鎖與自適應(yīng)自旋

互斥同步中,對性能最大的影響是阻塞的實現(xiàn):掛起線程和恢復(fù)線程的操作都需要轉(zhuǎn)入內(nèi)核態(tài)去完成,這些操作給系統(tǒng)的并發(fā)性帶來了很大的壓力。為此我們設(shè)置了自旋鎖,讓線程執(zhí)行一個忙循環(huán)(等待)。

自旋鎖的評估
自旋鎖本身雖然避免了線程切換的開銷,但它是要占用處理器的時間。因此,如果鎖被占有的時間很短,自旋等待的效果會非常好;反之,如果鎖被占有的時間很長,那么自旋的線程只會白白浪費處理器資源。因此,自旋等待的時間必須有一定的限度,如果超過了限定的次數(shù)仍然沒有成功獲得鎖,就應(yīng)當(dāng)使用傳統(tǒng)的方式掛起線程。自旋次數(shù)的默認(rèn)值為10,用戶可以通過使用參數(shù)-XX:PreBlockSpin來更改。

自適應(yīng)自旋鎖

自適應(yīng)意味著自旋的時間不再固定,而是由前一次在同一個鎖的自旋時間及鎖的擁有者的狀態(tài)來決定。如果在同一對象上,自旋等待剛剛成功獲得鎖,并且持有鎖的線程正在運行中,那么虛擬機就會認(rèn)為這次自旋也很有可能成功,進而它允許自旋等待持續(xù)相對較長時間。如果對于某個鎖,自旋很少成功,那么在以后獲取這個鎖時將可能省略掉自旋過程,以避免浪費處理器資源。

鎖消除

鎖消除是指虛擬機即時編譯器運行時,對一些代碼要求同步,但是被檢測到不可能存在共享數(shù)據(jù)競爭的鎖進行消除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容