Java中syncronized锁升级的过程

在 Java 中,synchronized 锁的升级过程是 JVM 中锁优化机制的一部分。这一过程旨在减少线程竞争时的性能开销,并提高程序在不同并发场景下的性能表现。Java 的锁机制在 JVM 中进行了多种优化,主要包括偏向锁轻量级锁重量级锁,这些锁状态会在特定条件下发生升级。

以下是 synchronized 锁的升级过程:

1.无锁状态

当对象被创建时,默认处于无锁状态。此时没有任何线程访问该对象的 synchronized 代码块,JVM 也不会进行锁操作。

2. 偏向锁(Biased Locking)

何时触发:
当一个线程第一次访问某个 synchronized 块时,JVM 会尝试将对象的锁标记为偏向锁
此时锁被偏向(Biased)于第一个访问的线程,并且在后续的执行过程中,如果没有其他线程来竞争该锁,持有偏向锁的线程无需再次进行同步操作。这大大降低了没有竞争情况下的锁开销。

工作原理:

  • 当第一个线程获取偏向锁时,JVM 会在对象头中记录该线程的 ID。
  • 当该线程再次进入该 synchronized 块时,它不需要进行 CAS(Compare-And-Swap)操作,因为它已经偏向了该线程。

偏向锁的撤销:
当另一个线程尝试访问同一个 synchronized 块时,偏向锁会被撤销,进入下一阶段,即轻量级锁。偏向锁的撤销会带来一定的开销,但在单线程无竞争的场景下,偏向锁的性能提升是显著的。

3. 轻量级锁(Lightweight Locking)

何时触发:
当偏向锁被撤销,并且多个线程开始竞争同一把锁时,JVM 会将锁升级为轻量级锁。

工作原理:

  • 在轻量级锁阶段,JVM 会为当前线程创建一个锁记录(Lock Record),这个锁记录会被保存在线程的栈帧中。
  • 然后 JVM 会尝试使用 CAS 操作将对象头中的锁标志设置为指向该线程的锁记录。如果 CAS 成功,线程获取锁,进入
    synchronized 块执行代码。
  • 如果 CAS 失败,说明其他线程也在竞争该锁,则会进入锁膨胀(升级到重量级锁)过程。

优点:
轻量级锁是通过自旋和 CAS 操作来避免线程切换的,适合锁竞争不激烈、持有锁时间很短的场景。在短时间内,线程可能不会进入阻塞状态,从而减少线程切换的开销。

4. 重量级锁(Heavyweight Locking)

何时触发:
当多个线程竞争同一个锁时,并且轻量级锁的自旋机制无法成功获取锁时,锁会膨胀为重量级锁

工作原理:

  • 重量级锁会让那些未能获取锁的线程进入阻塞状态,直到持有锁的线程释放锁。
  • 重量级锁涉及操作系统的互斥锁机制(Mutex),会导致线程切换和上下文切换,开销较大。

线程的状态:

  • 在重量级锁阶段,竞争锁的线程会被挂起,进入阻塞队列中,等待锁的释放。
  • 当持有锁的线程释放锁时,JVM 会唤醒阻塞的线程,重新进行锁的竞争。

锁的标志位(Mark Word)

JVM 中的对象头(Object Header)包含了一个称为 Mark Word 的区域,用于记录锁的状态、线程 ID、哈希码等信息。锁的升级过程通过修改对象头的 Mark Word 来标识当前的锁状态。

  • 偏向锁: Mark Word 记录了持有锁的线程 ID
  • 轻量级锁: Mark Word 记录指向线程栈中的锁记录的指针
  • 重量级锁: Mark Word 记录指向重量级锁的指针(通常是操作系统的互斥量)。

锁的升级与降级

升级:
锁只能从偏向锁升级为轻量级锁,再升级为重量级锁,这个过程是不可逆的,锁一旦升级,就不会降级为轻量级锁或偏向锁。这种设计是为了简化 JVM 的锁管理,避免频繁的状态切换带来的额外开销。

降级:
在某些 JVM 实现中,如果没有竞争,锁可以从重量级锁释放回偏向锁或轻量级锁,但这是很少见的情况,大多数 JVM 并不支持锁的降级

总结

  • 无锁状态: 对象初始状态,没有任何锁。
  • 偏向锁: 当只有一个线程访问时,锁会偏向于该线程,后续访问无需重新加锁。
  • 轻量级锁: 当多个线程竞争锁时,锁会升级为轻量级锁,通过 CAS 操作和自旋来避免线程阻塞。
  • 重量级锁: 当锁竞争激烈,轻量级锁失败后,锁会升级为重量级锁,线程会被阻塞,等待锁的释放。

锁的升级过程是 JVM 的一项优化机制,旨在适应不同的并发场景,提升程序的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值