面试题 锁消除是什么
生活随笔
收集整理的這篇文章主要介紹了
面试题 锁消除是什么
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鎖消除是在編譯器級別的事情。
在即時編譯器時,如果發現不可能被共享的對象,則可以消除這些對象的鎖操作。
也許你會覺得奇怪,既然有些對象不可能被多線程訪問,那為什么要加鎖呢?寫代碼時直接不加鎖不就好了。
但是有時,這些鎖并不是程序員所寫的,有的是JDK實現中就有鎖的,比如Vector和StringBuffer這樣的類,它們中的很多方法都是有鎖的。當我們在一些不會有線程安全的情況下使用這些類的方法時,達到某些條件時,編譯器會將鎖消除來提高性能
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");} }?上述代碼中的StringBuffer.append是一個同步操作,但是StringBuffer卻是一個局部變量,并且方法也并沒有把StringBuffer返回,所以不可能會有多線程去訪問它。那么此時StringBuffer中的同步操作就是沒有意義的。
開啟鎖消除是在JVM參數上設置的,當然需要在server模式下:
并且要開啟逃逸分析。 逃逸分析的作用呢,就是看看變量是否有可能逃出作用域的范圍
當JVM參數為:
-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks耗時119ms
當JVM參數為:
-server -XX:+DoEscapeAnalysis -XX:-EliminateLocks耗時140ms
?表明鎖消除的效果還是很明顯的。
總結
以上是生活随笔為你收集整理的面试题 锁消除是什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringCloud stream连接
- 下一篇: HDU 5468 Puzzled Ele