国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 虛擬機(jī)對(duì)鎖優(yōu)化所做的努力

ralap / 2396人閱讀

摘要:自選鎖鎖膨脹后,虛擬機(jī)為了避免線程真實(shí)地在操作系統(tǒng)層面掛起,虛擬機(jī)還會(huì)在做最后的努力自選鎖。

作為一款公用平臺(tái),JDK 本身也為并發(fā)程序的性能絞盡腦汁,在 JDK 內(nèi)部也想盡一切辦法提供并發(fā)時(shí)的系統(tǒng)吞吐量。這里,我將向大家簡單介紹幾種 JDK 內(nèi)部的 "鎖" 優(yōu)化策略。

1、 鎖偏向

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

如果一個(gè)線程獲得了鎖,那么鎖就進(jìn)入偏向模式。當(dāng)這個(gè)線程再次請求鎖時(shí),無須再做任何同步操作。這樣就節(jié)省了大量有關(guān)鎖申請的操作,從而提高了程序性能。因此,對(duì)于幾乎沒有鎖競爭的場合,偏向鎖有比較紅啊的優(yōu)化效果,因?yàn)檫B續(xù)多次極有可能是同一個(gè)線程請求相同的鎖。而對(duì)于鎖競爭比較激烈的場合,其效果不佳。因?yàn)樵诟偁幖ち业膱龊希钣锌赡艿那闆r是每次都是不同的線程來請求相同的鎖。

2、 輕量級(jí)鎖

如果偏向鎖失敗,即上一個(gè)請求的鎖的線程和這個(gè)線程不是同一個(gè)。偏向鎖失敗意味者不能避免做同步操作。此時(shí),虛擬機(jī)并不會(huì)立即掛起線程。他會(huì)使用一種成為輕量級(jí)鎖的優(yōu)化手段。 輕量級(jí)鎖的操作也很方便,它只是簡單地將對(duì)象頭部作為指針,指向蚩尤鎖的線程堆棧的內(nèi)部,來判斷一個(gè)線程是否持有對(duì)象鎖。 如果線程獲得輕量級(jí)鎖成功,則可以順利進(jìn)入臨界區(qū)。如果輕量級(jí)鎖失敗,則表示其他線程搶先爭奪了鎖,那么當(dāng)前線程的鎖請求就會(huì)膨脹為重量級(jí)鎖。

3、 自選鎖

鎖膨脹后,虛擬機(jī)為了避免線程真實(shí)地在操作系統(tǒng)層面掛起,虛擬機(jī)還會(huì)在做最后的努力–自選鎖。由于當(dāng)前線程暫時(shí)無法獲得鎖,但是什么時(shí)候可以獲得鎖是一個(gè)未知數(shù)。也許在CPU幾個(gè)時(shí)鐘周期后,就可以得到鎖。如果這樣,簡單粗暴的掛起線程可能是一種得不償失的操作,因此系統(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)行上下文的掃描,去除不可能存在共享資源競爭的鎖。通過鎖消除,可以節(jié)省毫無意義的請求鎖時(shí)間。

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

public String []  createStrings(){
    Vector  v= new Vector();
    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ī)檢測到這種情況,就會(huì)將這些無用的鎖操作去除。

鎖消除涉及的一項(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高并發(fā)程序設(shè)計(jì)》一書。

教程:史上最強(qiáng) Spring Boot & Cloud 教程匯總

工具:推薦一款在線創(chuàng)作流程圖、思維導(dǎo)圖軟件

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/76865.html

相關(guān)文章

  • 值得保存的 synchronized 關(guān)鍵字總結(jié)

    摘要:無論是互斥鎖,還是自旋鎖,在任何時(shí)刻,最多只能有一個(gè)保持者,也就說,在任何時(shí)刻最多只能有一個(gè)執(zhí)行單元獲得鎖。另外在中引入了自適應(yīng)的自旋鎖。和關(guān)鍵字的總結(jié)推薦一 該文已加入開源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí))。地址:https://github.com/Snailclimb... 本文是對(duì) synchronized 關(guān)鍵字使用、底層原理、JD...

    miguel.jiang 評(píng)論0 收藏0
  • 學(xué)習(xí)JVM必看書籍

    學(xué)習(xí)JVM的相關(guān)資料 《深入理解Java虛擬機(jī)——JVM高級(jí)特性與最佳實(shí)踐(第2版)》 showImg(https://segmentfault.com/img/bVbsqF5?w=200&h=200); 基于最新JDK1.7,圍繞內(nèi)存管理、執(zhí)行子系統(tǒng)、程序編譯與優(yōu)化、高效并發(fā)等核心主題對(duì)JVM進(jìn)行全面而深入的分析,深刻揭示JVM的工作原理。以實(shí)踐為導(dǎo)向,通過大量與實(shí)際生產(chǎn)環(huán)境相結(jié)合的案例展示了解...

    shaonbean 評(píng)論0 收藏0
  • 以太坊連載(四):以太坊發(fā)展歷史回顧

    摘要:以太坊發(fā)布加密貨幣網(wǎng)絡(luò)年月初文章在上宣布以太坊首次向比特幣社群宣布以太坊。銷售所得首先用于償還日益增加的法律債務(wù),回報(bào)開發(fā)者們數(shù)月以來的努力,以及資助以太坊的持續(xù)開發(fā)。以太坊安全審查開始于年末,持續(xù)到年上半年。 以太坊歷史最近歷史記錄,請查看Taylor Gerring博客發(fā)帖。 誕生2013年末Vitalik Buterin第一次描述了以太坊,作為他研究比特幣社群的成果,不久后,Vi...

    hlcfan 評(píng)論0 收藏0
  • 為了vue-cli spa項(xiàng)目優(yōu)化首屏做的事情

    摘要:第一次寫項(xiàng)目,但是在實(shí)踐的過程發(fā)現(xiàn)了很多坑,這篇文章主要講述的是項(xiàng)目首屏加載過慢的大坑。建議使用,相對(duì)來說算是比較快的了。在官方文檔中有相關(guān)實(shí)現(xiàn)的代碼,很簡單。畢竟首屏加載,優(yōu)化都得靠了。 第一次寫 vue spa項(xiàng)目,但是在實(shí)踐的過程發(fā)現(xiàn)了很多坑,這篇文章主要講述的是spa項(xiàng)目首屏加載過慢的大坑。在webpack的配置中,在打包的過程中,會(huì)將所有的庫都打包到vendor.js中,所以...

    layman 評(píng)論0 收藏0
  • Java HotSpot VM中的JIT編譯

    摘要:如同其它虛擬機(jī),虛擬機(jī)為字節(jié)碼提供了一個(gè)運(yùn)行時(shí)環(huán)境。編譯是一個(gè)混合模式的虛擬機(jī),也就是說它既可以解釋字節(jié)碼,又可以將代碼編譯為本地機(jī)器碼以更快的執(zhí)行。解決此問題一般是在進(jìn)程啟動(dòng)后,對(duì)代碼進(jìn)行預(yù)熱以使它們被強(qiáng)制編譯。 Java HotSpot虛擬機(jī)是Oracle收購Sun時(shí)獲得的,JVM和開源的OpenJDK都是以此虛擬機(jī)為基礎(chǔ)發(fā)展的。如同其它虛擬機(jī),HotSpot虛擬機(jī)為字節(jié)碼提供了一...

    caozhijian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<