溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java虛擬機(jī)對(duì)鎖優(yōu)化方法是什么

發(fā)布時(shí)間:2021-11-30 14:04:53 來源:億速云 閱讀:114 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Java虛擬機(jī)對(duì)鎖優(yōu)化方法是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1、 鎖偏向

鎖偏向是一種針對(duì)加鎖操作的優(yōu)化手段。

如果一個(gè)線程獲得了鎖,那么鎖就進(jìn)入偏向模式。當(dāng)這個(gè)線程再次請(qǐng)求鎖時(shí),無須再做任何同步操作。這樣就節(jié)省了大量有關(guān)鎖申請(qǐng)的操作,從而提高了程序性能。

因此,對(duì)于幾乎沒有鎖競(jìng)爭(zhēng)的場(chǎng)合,偏向鎖有比較紅啊的優(yōu)化效果,因?yàn)檫B續(xù)多次極有可能是同一個(gè)線程請(qǐng)求相同的鎖。而對(duì)于鎖競(jìng)爭(zhēng)比較激烈的場(chǎng)合,其效果不佳。因?yàn)樵诟?jìng)爭(zhēng)激烈的場(chǎng)合,最有可能的情況是每次都是不同的線程來請(qǐng)求相同的鎖。點(diǎn)擊這里了解幾種常見的鎖。

2、 輕量級(jí)鎖

如果偏向鎖失敗,即上一個(gè)請(qǐng)求的鎖的線程和這個(gè)線程不是同一個(gè)。偏向鎖失敗意味者不能避免做同步操作。此時(shí),虛擬機(jī)并不會(huì)立即掛起線程。他會(huì)使用一種成為輕量級(jí)鎖的優(yōu)化手段。 

輕量級(jí)鎖的操作也很方便,它只是簡(jiǎn)單地將對(duì)象頭部作為指針,指向蚩尤鎖的線程堆棧的內(nèi)部,來判斷一個(gè)線程是否持有對(duì)象鎖。 如果線程獲得輕量級(jí)鎖成功,則可以順利進(jìn)入臨界區(qū)。如果輕量級(jí)鎖失敗,則表示其他線程搶先爭(zhēng)奪了鎖,那么當(dāng)前線程的鎖請(qǐng)求就會(huì)膨脹為重量級(jí)鎖。點(diǎn)擊這里了解幾種常見的鎖。

3、 自選鎖

鎖膨脹后,虛擬機(jī)為了避免線程真實(shí)地在操作系統(tǒng)層面掛起,虛擬機(jī)還會(huì)在做最后的努力–自選鎖。由于當(dāng)前線程暫時(shí)無法獲得鎖,但是什么時(shí)候可以獲得鎖是一個(gè)未知數(shù)。也許在CPU幾個(gè)時(shí)鐘周期后,就可以得到鎖。如果這樣,簡(jiǎn)單粗暴的掛起線程可能是一種得不償失的操作,因此系統(tǒng)會(huì)進(jìn)行一次賭注:它會(huì)假設(shè)在不久的將來,線程可以得到這把鎖。

因此虛擬機(jī)讓當(dāng)前線程做個(gè)空循環(huán),在經(jīng)過若干次循環(huán)后,如果可以得到鎖,那么就順利進(jìn)入臨界區(qū)。如果還不能得到鎖,才會(huì)真實(shí)地將線程在操作系統(tǒng)層面掛起。

4、 鎖消除

鎖消除是一種更徹底的鎖優(yōu)化。Java虛擬機(jī)在JIT編譯時(shí),通過對(duì)運(yùn)行上下文的掃描,去除不可能存在共享資源競(jìng)爭(zhēng)的鎖。通過鎖消除,可以節(jié)省毫無意義的請(qǐng)求鎖時(shí)間。

下面這種這種情況,我們使用vector, 而vector內(nèi)部使用了synchronize請(qǐng)求鎖。

public String []  createStrings(){
    Vector<String>  v= new Vector<String>();
    for(int i=0;i<100;i++){
        v.add(Integer.toString(i));
    }
    return v.toArray(new String[]{});
}

由于V只在函數(shù) createStrnigs 中使用,因此它只是一個(gè)單純的局部變量。局部變量是在線程棧上分配的,屬于線程私有額數(shù)據(jù),因此不可能被其他線程訪問。所以,在這種情況下,Vector內(nèi)部所有加鎖同步都是沒有必要的。如果虛擬機(jī)檢測(cè)到這種情況,就會(huì)將這些無用的鎖操作去除。點(diǎn)擊這里了解幾種常見的鎖。

鎖消除涉及的一項(xiàng)關(guān)鍵技術(shù)為逃逸分析。所謂逃逸分析就是觀察某一個(gè)變量是否會(huì)逃出某一個(gè)作用域。在本例中,變量v顯然沒有逃出createString 函數(shù)之外。以此為基礎(chǔ),虛擬機(jī)才可以大膽的將v內(nèi)部的加鎖操作去除。如果createStrings 返回的不是String數(shù)組,而是v本身,那么就認(rèn)為變量v逃逸出了當(dāng)前函數(shù),也就是說v有可能被其他線程訪問。如是這樣,虛擬機(jī)就不能消除v中的鎖操作。

逃逸分析必須在 -server 模式下進(jìn)行,可以使用 -XX:DoEscapeAnalysis 參數(shù)打開逃逸分析,使用 -XX:+EliminateLocks 參數(shù)可以打開鎖消除。

“Java虛擬機(jī)對(duì)鎖優(yōu)化方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI