原生鎖優(yōu)化

前言

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

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

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

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

自適應(yīng)自旋鎖

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

鎖消除

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容