天天看點

Java鎖消除

鎖消除(Lock Elimination)

鎖消除即删除不必要的加鎖操作。根據代碼逃逸技術,如果判斷到一段代碼中,堆上的資料不會逃逸出目前線程,那麼可以認為這段代碼是線程安全的,不必要加鎖。

public class Test {
	
	// java -server -XX:+DoEscapeAnalysis -XX:+EliminateLocks -XX:-UseBiasedLocking Test

    public static void main(String[] args) {
        System.out.println("Test started..." + System.currentTimeMillis());
		Test test = new Test();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            test.append("abc", "def");
        }
        System.out.println("Time=" + (System.currentTimeMillis() - start));
		  System.out.println("Test end..." + System.currentTimeMillis());
    }
	
	 public void append(String str1, String str2) {
        StringBuffer sb = new StringBuffer();
        sb.append(str1).append(str2);
    }
}
           

執行結果

Java鎖消除

StringBuffer屬于一個局部變量,并且不會從該方法中逃逸出去,是以其實這過程是線程安全的,可以将鎖消除。

為了盡量減少其他因素的影響,這裡禁用了偏向鎖(-XX:-UseBiasedLocking)。通過上面程式,可以看出消除鎖以後性能還是有比較大提升的。

參考 

https://www.jianshu.com/p/39628e1180a9

https://www.cnblogs.com/paddix/p/5405678.html