一 点睛
线程同步的代价是相当高的,同步的后果是降低并发性和性能。
在动态编译同步块的时候,JIT 编译器可以借助逃逸分析来判断同步块所使用的锁对象是否只能够被一个线程访问而没有被发布到其他线程。如果没有,那么 JIT 编译器在编译这个同步块的时候就会取消对这部分代码的同步。这样就能大大提高并发性和性能。这个取消同步的过程就叫同步省略,也叫锁消除。
二 实战
1 代码
/**
* 同步省略说明
*/
public class SynchronizedTest {
public void f() {
Object hollis = new Object();
synchronized (hollis) {
System.out.println(hollis);
}
}
}
2 分析
代码中对 hellis 这个对象加锁,但是 hellis 对象的生命周期只在 f() 方法中,并不会被其他线程所访问到,所以在 JIT 编译阶段就会被优化掉,优化成如下代码。
public void f() {
Object hellis = new Object();
System.out.println(hellis);
}
我们将其转换成字节码
注意:同步优化是运行时优化掉的,不是在生成 class 文件时优化掉的。