鎖優(yōu)化(2)--- 鎖消除

鎖消除是指虛擬機即時編譯器再運行時,對一些代碼上要求同步,但是被檢測到不可能存在共享數(shù)據(jù)競爭的鎖進行消除。

如果一段代碼中,堆上的數(shù)據(jù)都不會逃逸出去從而被其他線程訪問到,那就可以把它們當作棧上的數(shù)據(jù)對待,認為它們是線程私有的,同步加鎖自然也就無需進行。

    public String concatString(String s1, String s2, String s3) {
        return s1 + s2 + s3;
    }

上面的代碼怎么看都跟同步?jīng)]什么關(guān)系,但是由于String是一個不可變的類,對字符串的連接操作總是生成新的String對象來進行的,因此這里就存在優(yōu)化的點。再JDK1.5之前,會轉(zhuǎn)化成StringBuffer對象的連續(xù)append()操作,再JDK1.5及其以后的版本,會轉(zhuǎn)化為StringBuilder對象的連續(xù)append()操作,即:

    public String cancatString(String s1, String s2, String s3){
        StringBuffer sb = new StringBuffer();
        sb.append(s1);
        sb.append(s2);
        sb.append(s3);
        return sb.toString();
    }

從這面就可以知道在實際的操作中是有牽涉到同步的,因為StringBuffer.append()方法中都有一個同步塊,鎖的對象就是sb。虛擬機觀察sb,很快就會發(fā)現(xiàn)它的動態(tài)作用域被限制在concatString()方法內(nèi)部。因此這里雖然有鎖,但是可以被安全的消除掉,在即時編譯之后,這段代碼會忽略掉所有的同步而直接執(zhí)行了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • synchronized的作用、特性 在java線程模型中,對同一對象或類使用synchronized,會使得多個...
    Mars_M閱讀 2,135評論 0 5
  • 孤身適赤壁, 兩岸山相離。 碧液搖光滿, 長風(fēng)催舟急。 從5.28開始一直想寫一個故事,今天拖著感冒流鼻涕的鼻子,...
    腎毒閱讀 480評論 9 10
  • 不堪一擊的不只是生活, 還有我們的胃。 ——Down Down 語錄 在我們95后還沉浸在曾經(jīng)飯?zhí)脫尣?、喝酒擼串、...
    553120閱讀 297評論 0 0
  • 沒有光滑的肌膚 淚水積在深深的皺紋里 幾天幾夜都無法揮去 沒有沁人的體香 粘膩的污泥滲進肉里 經(jīng)過的唯恐避之不及 ...
    夤夜微茫閱讀 370評論 5 10
  • 《圍城》如果是按照婚姻愛情文去想,看過之后未免有些失望,很想續(xù)寫或者改寫。文中大約有三分之一的部分都在寫方鴻漸,蘇...
    趕海的詩人閱讀 766評論 0 0

友情鏈接更多精彩內(nèi)容