锁消除和锁粗化浅析

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

    public void method() {

        Object object = new Object();

        synchronized (object) {
            System.out.println("hello world");
        }
    }
}

上面这个例子,因为synchronized关键字锁的是一个局部对象,也就是说,进入方法内线程都会创建一个object对象,所以,这段代码块加不加锁其实没有任何意义。那么JIT编译器就会对他进行锁消除,来减少锁的开销。

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

    private Object object = new Object();

    public void method() {

        synchronized (object) {
            System.out.println("hello world");
        }

        synchronized (object) {
            System.out.println("welcome");
        }

        synchronized (object) {
            System.out.println("person ");
        }
    }
}

上面这个例子,每个线程进入方法的时候,都需要获取同步代码块。因为object是全局共享对象,只能有一个线程进入,然后执行完一个方法,线程再去获取对象的锁,为了减少申请与释放锁的开销,JIT会对代码进行锁粗化。

如果您看出来了,有什么问题,麻烦您提出来,一起进步

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值