日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java虛擬機對鎖優(yōu)化所做的努力

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

作者:佚名 2018-09-11 14:24:34
云計算
虛擬化 作為一款公用平臺,JDK 本身也為并發(fā)程序的性能絞盡腦汁,在 JDK 內(nèi)部也想盡一切辦法提供并發(fā)時的系統(tǒng)吞吐量。這里,我將向大家簡單介紹幾種 JDK 內(nèi)部的 "鎖" 優(yōu)化策略。

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

1、 鎖偏向

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

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

因此,對于幾乎沒有鎖競爭的場合,偏向鎖有比較紅啊的優(yōu)化效果,因為連續(xù)多次極有可能是同一個線程請求相同的鎖。而對于鎖競爭比較激烈的場合,其效果不佳。因為在競爭激烈的場合,最有可能的情況是每次都是不同的線程來請求相同的鎖。點擊這里了解幾種常見的鎖。

2、 輕量級鎖

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

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

3、 自選鎖

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

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

4、 鎖消除

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

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

  
 
 
  1. public String []  createStrings(){ 
  2.     Vector  v= new Vector(); 
  3.     for(int i=0;i<100;i++){ 
  4.         v.add(Integer.toString(i)); 
  5.     } 
  6.     return v.toArray(new String[]{}); 

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

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

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


分享文章:Java虛擬機對鎖優(yōu)化所做的努力
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/djicgcg.html