標籤:鎖 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鎖消除