锁消除技术与逃逸分析

JIT编译器(Just In Time编译器)可以在动态编译同步代码时,使用一种叫做逃逸分析的技术,来通过该项技术判别程序中所使用的锁对象是否只被一个线程所使用,而没有散 布到其他线程当中;如果情况就是这样的话,那么JIT编译器在编译这个同步代码时就不会生成synchronized关键字所标识的锁的申请与释放机器码,从而消除 了锁的使用流程。

  1. public void method() {
  2. Object object = new Object();
  3. synchronized (object) {
  4. System.out.println("hello world");
  5. }
  6. }

image.png :::warning 即使看起来代码应该是逃逸分析判定成功 ,使用javap查看字节码会发现里面还是会有monitor指令,但是真正执行时是由JIT编译器(即时编译)来进行判定。 :::

锁粗化

JIT编译器在执行动态编译时,若发现前后相邻的synchronized块使用的是同一个锁对象,那么它就会把这几个synchronized块给合并为一个较大的同步块,这样做的好处在于线程在执行这些代码时,就无需频繁申请与释放锁了,从而达到申请与释放锁一次,就可以执行完全部的同步代码块,从而提升了性能。

  1. public class MyTest5 {
  2. private Object object = new Object();
  3. public void method() {
  4. synchronized (object) {
  5. System.out.println("hello world");
  6. }
  7. synchronized (object) {
  8. System.out.println("welcome");
  9. }
  10. synchronized (object) {
  11. System.out.println("person");
  12. }
  13. }
  14. }

image.png