Java鎖消除

來源:互聯網
上載者:User

標籤:鎖   java虛擬機器   jvm   並發   

概述

鎖消除是Java虛擬機器在JIT編譯是,通過對運行內容相關的掃描,去除不可能存在共用資源競爭的鎖,通過鎖消除,可以節省毫無意義的請求鎖時間。

實驗

看如下代碼:

package com.winwill.lock;/** * @author qifuguang * @date 15/6/5 14:11 */public class TestLockEliminate {    public static String getString(String s1, String s2) {        StringBuffer sb = new StringBuffer();        sb.append(s1);        sb.append(s2);        return sb.toString();    }    public static void main(String[] args) {        long tsStart = System.currentTimeMillis();        for (int i = 0; i < 1000000; i++) {            getString("TestLockEliminate ", "Suffix");        }        System.out.println("一共耗費:" + (System.currentTimeMillis() - tsStart) + " ms");    }}

getString()方法中的StringBuffer數以函數內部的局部變數,進作用於方法內部,不可能逃逸出該方法,因此他就不可能被多個線程同時訪問,也就沒有資源的競爭,但是StringBuffer的append操作卻需要執行同步操作:

    @Override    public synchronized StringBuffer append(String str) {        toStringCache = null;        super.append(str);        return this;    }

逃逸分析和鎖消除分別可以使用參數-XX:+DoEscapeAnalysis和-XX:+EliminateLocks(鎖消除必須在-server模式下)開啟。使用如下參數運行上面的程式:

-XX:+DoEscapeAnalysis -XX:-EliminateLocks

得到如下結果:

使用如下命令運行程式:

-XX:+DoEscapeAnalysis -XX:+EliminateLocks

得到如下結果:

結論

由上面的例子可以看出,關閉了鎖消除之後,StringBuffer每次append都會進行鎖的申請,浪費了不必要的時間,開啟鎖消除之後效能得到了提高。

Java鎖消除

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.