鎖消除(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);
}
}
執行結果
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsIjMfVmepNHLzMGVMd0VaVzRXpVNBJUaUVkTxE1X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1QTM3MTOwIjM0IDOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
StringBuffer屬于一個局部變量,并且不會從該方法中逃逸出去,是以其實這過程是線程安全的,可以将鎖消除。
為了盡量減少其他因素的影響,這裡禁用了偏向鎖(-XX:-UseBiasedLocking)。通過上面程式,可以看出消除鎖以後性能還是有比較大提升的。
參考
https://www.jianshu.com/p/39628e1180a9
https://www.cnblogs.com/paddix/p/5405678.html