美文网首页
17 自旋锁和自适应自旋锁有什么区别

17 自旋锁和自适应自旋锁有什么区别

作者: 滔滔逐浪 | 来源:发表于2022-11-03 08:31 被阅读0次
   自旋锁的概念: 阻塞或唤醒一个java线程需要操作系统切换cpu状态来完成,这种状态装换需要耗费处理器的时间。如果同步代码块中的内容过于简单,状态转换消耗的时间有可能比用户执行代码的时间还要长。
  在许多场景下,同步资源的锁定时间较短,为了这一小段时间去切换线程,线程挂起和恢复线程花费可能会让系统得不偿失。如果物理机器有多个处理器,能让2个或者多个线程同时并行执行。我们可以让后面那个请求锁的线程不放弃cpu的执行时间,看看持有锁的线程是否会很快就会释放锁。
  而为了让当前线程 "稍等一下",我们需要让当前线程锁自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程不必阻塞而是直接获取同步资源,从而避免切换线程的开销。这就是自旋锁。
    自旋锁的缺点: 自旋锁本身是有缺点的,他不能代替阻塞,自旋等待虽然避免了线程切换的开销,但是他要占用cpu处理器的时间,如果锁被占用的时间很短,自旋等待的效果就会非常好。反之,如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器的资源。所以,自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数(默认是10次,可以用 -XX:PreBlockSpin来更改)没有成功获得锁,就应该挂起线程。自旋锁的原理同样也是cas。
   适应性自旋锁:自适应意味着自旋的时间(次数)不在固定,而是由前一次在同一个锁上的自旋时间以及锁的拥有者的状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在执行中,那么虚拟机就会认为这次自旋也是很有可能再次成功,进而他讲允许自旋等待的持续相对更长的时间。如果对于某个锁,自旋很少成功获得过,那子啊以后尝试获取这个锁时将可能省略自旋过程,直接阻塞线程,避免浪费处理器资源。

相关文章

  • Java锁的优化

    一、自旋锁与自适应自旋(Adaptive Spinning) 自旋锁:由于线程阻塞会引起性能的压力,频繁挂起和恢复...

  • 17 自旋锁和自适应自旋锁有什么区别

  • 一文讲解重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁

    重量级锁?自旋锁?自适应自旋锁?轻量级锁?偏向锁?悲观锁?乐观锁?执行一个方法咋这么辛苦,到处都是锁。 今天这篇文...

  • CLH并发队列

    1 什么是自旋锁和互斥锁? 由于CLH锁是一种自旋锁,那么我们先来看看自旋锁是什么? 自旋锁说白了也是一种互斥锁,...

  • 并发里面的各种锁

    本文将讲解并发过程中可能会用到的各种锁,分别为重量级锁,自旋锁,自适应自旋锁,轻量级锁,偏向锁,悲观锁,乐观锁.....

  • iOS 开发中加锁

    [1].OSSpinLock 自旋锁 [1]自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被...

  • Spinlock:什么是自旋锁

    在进一步了解自旋锁之前,先来理解下自旋锁的概念。什么是自旋锁?自旋锁有那些用途?和另一种互斥锁又是什么怎么回事儿?...

  • 13.3 锁优化

    1. 自旋锁与自适应自旋。共享数据的锁定只会持续短时间,通过自旋看看持有锁的线程是否会很快释放。1.6之后加入自适...

  • 关于自旋锁

    自旋锁是什么? spinlock,不断的自旋(自我循环)尝试获得锁。参考文档:Java中的自旋锁 自旋锁的实现 自...

  • 自旋锁与互斥锁

    自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保...

网友评论

      本文标题:17 自旋锁和自适应自旋锁有什么区别

      本文链接:https://www.haomeiwen.com/subject/ytyjtdtx.html