锁消除&锁粗化

锁消除

锁消除是指虚拟机即时编译器在运行时,对一些代码要求同步,但是对被检测到

不可能存在共享数据竞争的锁进行消除。锁消除的主要判定依据来源与逃逸分析

的数据支持,如果判断一段代码中,在堆上的所有数据都不会逃逸出去被其他线程

访问到,那就可以把它们当作栈上数据对待,认为它们是线程私有的,同步加锁

自然就无需再进行。

锁粗化

编写代码的时候,推荐将同步块的作用范围限制得尽量小。但如果在一系列的连续

操作都对同一个对象反复加锁和解锁,甚至加锁操作出现在循环体中,那即便没有

线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。

如果虚拟机探测到有一串零碎的操作都对同一个对象加锁,将会把加锁同步的范围

扩展(粗化)到整个操作序列的外部。