【锁】synchronized 锁升级过程中有几次自旋?

本文详细介绍了Java中synchronized关键字的锁升级过程,包括偏向锁、轻量级锁、自旋锁和锁膨胀。重点阐述了自旋原理及其在性能优化中的作用。
摘要由CSDN通过智能技术生成

在Java中,synchronized关键字用于实现对象级别的锁定,以确保多个线程对共享资源的安全访问。在进行synchronized锁的升级过程中,涉及到多次自旋,接下来我将从原理层详细介绍。

1. 锁的升级过程
当一个线程尝试获取某个对象的锁时,会经历以下几个阶段:

(1)偏向锁(Biased Locking)
初始时,对象的头部信息标记为偏向锁。当第一个线程访问这个对象时,对象头部的偏向锁标记会指向这个线程,并且之后该线程再次访问同步块时,无需再次竞争锁。这个阶段不涉及自旋,是一种快速获取锁的机制。

(2)轻量级锁(Lightweight Locking)
当有多个线程竞争同一个锁时,偏向锁会升级为轻量级锁。此时,系统会通过CAS(Compare And Swap)操作尝试在对象头部设置指向栈中锁记录的指针。如果竞争不激烈,其他线程会进入自旋(自旋次数有限制),尝试获取锁,避免进入阻塞状态。

(3)自旋锁(Spin Locking)
如果轻量级锁的竞争仍然激烈,没有获得锁的线程将进入自旋状态,不断重试获取锁,而不是立即进入阻塞状态。这样可以避免线程频繁地在用户态和内核态之间切换,提高性能。

(4)锁膨胀(Lock Coarsening)
如果自旋一定次数后仍未获取到锁,轻量级锁将升级为重量级锁,此时竞争激烈的锁将使用传统的互斥量来保护,等待队列中的线程将进入阻塞状态,直到持有锁的线程释放锁。

2. 自旋的原理
自旋是一种在多线程环境下等待锁的技术,它能减少线程阻塞带来的系统开销。自旋的实现原理基于处理器提供的指令集,通常是通过在一个循环中不断地检查锁的状态,直到成功获取锁或者达到最大自旋次数。

3. 自旋的次数
在Java中,自旋的次数是可以配置的,默认情况下是 10 次。如果在指定次数内未能获取到锁,线程将转而进入阻塞状态,以避免无谓的占用 CPU 资源。自旋次数的设定需要根据具体场景进行合理调整,以平衡性能和资源利用。

总之,synchronized 锁的升级过程中涉及多轮自旋,通过偏向锁、轻量级锁和自旋锁等机制,系统可以在一定程度上提高并发性能,同时避免线程频繁地进入阻塞状态带来的系统开销。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的架狗师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值