Java高并发程序-Chapter5 锁的优化及注意事项(第三十讲)虚拟机内的锁优化

本文介绍了Java中锁的优化手段,包括偏向锁、轻量级锁、自旋锁及锁消除等,并探讨了它们的工作原理及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.偏向锁

锁偏向是一种针对加锁操作的优化手段。它的核心思想是:如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。
因此,对于几乎没有锁竞争的场合,偏向锁有比较好的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。
而对于锁竞争比较激烈的场合,其效果不佳。
因为在竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相同的锁。
这样偏向模式会失效,因此还不如不启用偏向锁。

使用Java虚拟机参数XX:+ Use Biasedlocking可以开启偏向锁


2. 轻量级锁

如果偏向锁失败,虚拟机并不会立即挂起线程。
它还会使用一种称为轻量级锁的优化手段轻量级锁的操作也很轻便,它只是简单地将对象头部作为指针,指向持有锁的线程堆栈的内部来判断一个线程是否持有对象锁。
如果线程获得轻量级锁成功,则可以顺利进入临界区。
如果轻量级锁加锁失败,则表示其他线程抢先争夺到了锁,那么当前线程的锁请求就会膨胀为重量级锁。

 

3. 自旋锁

锁膨胀后,虚拟机为了避免线程真实地在操作系统层面挂起,虚拟机还会在做最后的努力—自旋锁。
由于当前线程暂时无法获得锁,但是什么时候可以获得锁是一个未知数。
也许在几个CPU时钟周期后,就可以得到锁。
如果这样,简单粗暴地挂起线程可能是一种得不偿失的操作。
因此,系统会进行一次赌注:它会假设在不久的将来,线程可以得到这把锁。
因此,虚拟机会让当前线程做几个空循环(这也是自旋的含义),在经过若干次循环后,如果可以得到锁,那么就顺利进入临界区。

如果还不能获得锁,才会真实地将线程在操作系统层面挂起


4. 锁消除

锁消除是一种更彻底的锁优化。
Java虚拟机在JIT编译时,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁。

通过锁消除,可以节省毫无意义的请求锁时间。



逃逸分析必须在- -server模式下进行,可以使用-xX:+ Doescape Analysis参数打开逃逸分析。
使用-XX:+ Eliminate Locks参数可以打开锁消除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值