以下不属于网站建设优化,大连建设网官方网站,网站建设费用属于管理费用科目,wordpress建的网站如何跟微信集成锁消除是在编译器级别的事情。
在即时编译器时#xff0c;如果发现不可能被共享的对象#xff0c;则可以消除这些对象的锁操作。
也许你会觉得奇怪#xff0c;既然有些对象不可能被多线程访问#xff0c;那为什么要加锁呢#xff1f;写代码时直接不加锁不就好了。
但是…锁消除是在编译器级别的事情。
在即时编译器时如果发现不可能被共享的对象则可以消除这些对象的锁操作。
也许你会觉得奇怪既然有些对象不可能被多线程访问那为什么要加锁呢写代码时直接不加锁不就好了。
但是有时这些锁并不是程序员所写的有的是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 表明锁消除的效果还是很明显的。