JVM中的锁优化

JVM锁优化机制

JVM通过自旋锁、自适应自旋、锁消除、锁粗化等技术优化同步性能,同时采用锁升级/降级机制动态调整锁状态。


一、锁升级与降级

锁的4种状态(级别由低到高):
  1. 无锁状态:初始状态,未发生竞争。
  2. 偏向锁:单线程重复获取锁时启用,避免CAS开销。
  3. 轻量级锁:多线程轻度竞争时通过CAS自旋获取锁。
  4. 重量级锁:竞争激烈时,线程阻塞并依赖操作系统调度。

锁升级/降级:JVM根据竞争情况自动切换锁状态(如偏向锁→轻量级锁)。
注意synchronized的锁只能升级(膨胀),不能降级(收缩)。


二、锁升级流程

1. 偏向锁(乐观锁)
  • 触发条件:首次线程通过CAS获取锁,Mark Word标记为偏向锁。
  • 特性
    • 同一线程再次获取锁时直接进入临界区,无需同步操作。
    • 适用于无实际竞争的场景(如单线程重复调用)。
2. 轻量级锁(乐观锁)
  • 触发条件:第二个线程尝试CAS获取锁失败(发生竞争)。
  • 过程
JVM优化是为了提高多线程程序的性能和并发度。其中膨胀是指当一个线程获取失败时,JVM会将其自旋一定次数,如果还没有获得,就会将膨胀升级。 膨胀的过程一般分为以下三个阶段: 1. 自旋(Spin Locking):当一个线程获取失败时,JVM会将其自旋一定次数,尝试获取。自旋的目的是为了减少线程切换的开销,因为线程进入自旋状态时不会释放CPU资源。如果自旋次数超过了阈值,那么就会进入下一个阶段。 2. 轻量级(Lightweight Locking):在这个阶段,JVM会为争用的线程在对象头上分配一些空间,用于存储记录。这个记录包含了的指针、持有的线程ID以及一些标志位等信息。如果记录的CAS操作成功,那么当前线程就获得了。如果CAS操作失败,那么就会进入下一个阶段。 3. 重量级(Heavyweight Locking):在这个阶段,JVM会将升级为重量级,也就是使用操作系统提供的互斥(Mutex)来保证线程的安全性。重量级的代价很高,因为它会涉及到用户态和内核态之间的切换,所以尽量避免的膨胀。 的膨胀过程可以通过JVM参数来调节,例如可以设置自旋次数、启用偏向等。在实际应用中,应该尽量避免的竞争,采用分离、读写、无编程等技术来提高程序的并发度和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值