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

資訊專欄INFORMATION COLUMN

Java 虛擬機對鎖優化所做的努力

ralap / 2392人閱讀

摘要:自選鎖鎖膨脹后,虛擬機為了避免線程真實地在操作系統層面掛起,虛擬機還會在做最后的努力自選鎖。

作為一款公用平臺,JDK 本身也為并發程序的性能絞盡腦汁,在 JDK 內部也想盡一切辦法提供并發時的系統吞吐量。這里,我將向大家簡單介紹幾種 JDK 內部的 "鎖" 優化策略。

1、 鎖偏向

鎖偏向是一種針對加鎖操作的優化手段。

如果一個線程獲得了鎖,那么鎖就進入偏向模式。當這個線程再次請求鎖時,無須再做任何同步操作。這樣就節省了大量有關鎖申請的操作,從而提高了程序性能。因此,對于幾乎沒有鎖競爭的場合,偏向鎖有比較紅啊的優化效果,因為連續多次極有可能是同一個線程請求相同的鎖。而對于鎖競爭比較激烈的場合,其效果不佳。因為在競爭激烈的場合,最有可能的情況是每次都是不同的線程來請求相同的鎖。

2、 輕量級鎖

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

3、 自選鎖

鎖膨脹后,虛擬機為了避免線程真實地在操作系統層面掛起,虛擬機還會在做最后的努力–自選鎖。由于當前線程暫時無法獲得鎖,但是什么時候可以獲得鎖是一個未知數。也許在CPU幾個時鐘周期后,就可以得到鎖。如果這樣,簡單粗暴的掛起線程可能是一種得不償失的操作,因此系統會進行一次賭注:它會假設在不久的將來,線程可以得到這把鎖。因此虛擬機讓當前線程做個空循環,在經過若干次循環后,如果可以得到鎖,那么就順利進入臨界區。如果還不能得到鎖,才會真實地將線程在操作系統層面掛起。

4、 鎖消除

鎖消除是一種更徹底的鎖優化。Java虛擬機在JIT編譯時,通過對運行上下文的掃描,去除不可能存在共享資源競爭的鎖。通過鎖消除,可以節省毫無意義的請求鎖時間。

下面這種這種情況,我們使用vector, 而vector內部使用了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只在函數 createStrnigs 中使用,因此它只是一個單純的局部變量。局部變量是在線程棧上分配的,屬于線程私有額數據,因此不可能被其他線程訪問。所以,在這種情況下,Vector內部所有加鎖同步都是沒有必要的。如果虛擬機檢測到這種情況,就會將這些無用的鎖操作去除。

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

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

本文摘自《Java高并發程序設計》一書。

教程:史上最強 Spring Boot & Cloud 教程匯總

工具:推薦一款在線創作流程圖、思維導圖軟件

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76865.html

相關文章

  • 值得保存的 synchronized 關鍵字總結

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

    miguel.jiang 評論0 收藏0
  • 學習JVM必看書籍

    學習JVM的相關資料 《深入理解Java虛擬機——JVM高級特性與最佳實踐(第2版)》 showImg(https://segmentfault.com/img/bVbsqF5?w=200&h=200); 基于最新JDK1.7,圍繞內存管理、執行子系統、程序編譯與優化、高效并發等核心主題對JVM進行全面而深入的分析,深刻揭示JVM的工作原理。以實踐為導向,通過大量與實際生產環境相結合的案例展示了解...

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

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

    hlcfan 評論0 收藏0
  • 為了vue-cli spa項目優化首屏做的事情

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

    layman 評論0 收藏0
  • Java HotSpot VM中的JIT編譯

    摘要:如同其它虛擬機,虛擬機為字節碼提供了一個運行時環境。編譯是一個混合模式的虛擬機,也就是說它既可以解釋字節碼,又可以將代碼編譯為本地機器碼以更快的執行。解決此問題一般是在進程啟動后,對代碼進行預熱以使它們被強制編譯。 Java HotSpot虛擬機是Oracle收購Sun時獲得的,JVM和開源的OpenJDK都是以此虛擬機為基礎發展的。如同其它虛擬機,HotSpot虛擬機為字節碼提供了一...

    caozhijian 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<