Java自旋锁

“自旋”的语义类似“空转”,也就是啥也没干。

 

在某些场景中,基于乐观的假设“稍等,很快就能拿到锁”,JVM 可以让获取锁失败的线程先等着,而不是直接被阻塞挂起。

这个等的过程就是“自旋”。这种获取锁的方式就是“自旋锁”。

 

JVM 让线程“自旋”的方法就是执行几个空循环。

  • 这个“自旋”操作会持续多久?
    • JVM 会根据运行时环境判断最长执行多久
  • 如果在自旋过程中,线程获得了锁,那么线程将停止自旋,进入临界区
  • 如果超过最长允许的自旋时间还未取得锁,目标线程会真的被挂起——操作系统层面上的挂起

自旋锁的性能

为什么会需要自旋锁。

  • 因为如果没有自旋锁,线程获取锁失败时是直接被挂起,将CPU等计算资源让给其它线程;
  • 等到锁可用时,该线程又被唤醒,把计算资源重新分配给它。
  • 这是一个比较耗资源的线程切换。
  • 可以粗略地比较线程自旋空转浪费的性能与切换线程的所耗费的性能,得出某些情况下自旋锁方案的整体性能更好。

 

  • 如果锁竞争不激烈,锁内代码耗时较短,自旋锁等待的时间也会较短,自旋锁就有性能优势。
  • 如果锁竞争激烈,或当期拥有锁的线程需要用该锁消耗较长时间执行同步代码,那么自旋锁的空转浪费的CPU资源可能大于没有自旋锁的方案。

 

自旋锁在单核CPU场景中无效

在单核CPU场景下:

  • 假设线程T1通过自旋锁方式尝试获取线程T2拥有的锁。
  • 因为T1在自旋等待锁时,一直占用了CPU,所以线程T2没有机会执行,T2一直处于挂起状态,也就无法释放锁。
  • 这就导致T1自旋等待期间是永远不可能拿到锁的。
  • 所以自旋锁在单核CPU场景中无效
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值