写点什么

Java 中的自旋锁和适应性自旋锁是什么意思?其分类依据是啥?

作者:wljslmz
  • 2022 年 10 月 01 日
    江苏
  • 本文字数:1102 字

    阅读完需:约 4 分钟

Java中的自旋锁和适应性自旋锁是什么意思?其分类依据是啥?

上一篇文章中,我们提到了锁的分类:



上一篇介绍了乐观锁和悲观锁,它们的分类依据是线程间是否需要锁住资源,需要锁住就是悲观锁,不需要锁住就是乐观锁


那么本文将带大家了解一下锁的第二个分类:自旋锁和适应性自旋锁,让我们直接开始。

一、自旋锁 vs 适应性自旋锁

这里大家一定很奇怪,既然有自旋锁,不应该有非自旋锁吗?其实,非自旋锁也有,不过这只是一个概念,我们通常情况下的锁都是非自旋锁,但是自旋锁这个锁确实需要单独定义出来。

1.1 自旋锁

自旋锁,从字面意思来看“自旋”,自己在那一直旋转,java 中那么肯定就是自己一直在那判断某种条件,比如我们会用 while 关键字。


那么真正的自旋锁是什么意思呢?


我们知道在多线程的情景下,多个线程去访问资源的时候,操作系统不是说真的在同一时刻去让多个线程同时操作某个资源,这个是不现实的,一般都是控制线程的处理时间点,然后频繁的切换线程,只是说这种切换时间对于我们来说极其的短,几乎感知不到,但是对于操作系统来说就显得很重要了。


那么自旋锁的意思呢,就是一个线程去访问某个资源的时候,发现该资源被前一个线程锁住了,还没有释放锁,这个时候该线程不会立马放弃,而是一直在循环,一直在等前一个线程释放锁,这个就是自旋锁。

1.2 适应性自旋锁

适应性自旋锁不是自旋锁的对立面,而是对自旋锁的优化,刚刚我们提到自旋锁是一直在等待前一个线程释放锁?但是假如前一个线程就是不释放呢?难道要一直等下去吗?我们要知道等待就是阻塞了线程的执行,那么既然是阻塞就会占用 CPU 的资源,就会增加时间,所以怎么办?


一般是限定自旋的次数,比如说自旋 5 次假如前一个线程还没有释放锁,那么干脆就被释放了,直接阻塞得了。


那么适应性自旋锁就是干这样的事的,只是说适应性自旋锁多个“适应性”,有点像 AI,它自己去判断这个锁大概还能锁多长时间,根据这个判断去设定自旋的次数。

1.3 判断依据

从上面对自旋锁和适应性自旋锁的介绍,大家看到最多的关键词事什么?


没错,就是阻塞


本小节开始就说过了,一般来说大多数锁都是非自旋的,为啥大多数锁不需要自旋?


废话,线程没有被阻塞我自旋它干啥,所以当资源访问失败,即被锁住的时候,需不需要阻塞就成了判断依据了,不需要阻塞,那就是自旋锁,假如还能自行判断自旋次数的,那么就是适应性自旋锁,是不是很简单?

二、总结

本文主要介绍了自旋锁和适应性自旋锁,其分类依据就是当资源访问被锁住的时候,需不需要阻塞,需要阻塞就是自旋锁,如果还能自行判断自旋次数的,那么就是适应性自旋锁。


希望本文对您认识自旋锁和适应性自旋锁有所帮助,在阅读的同时有任何疑问可以在下方评论区与我讨论,下一篇文章,将带您了解一下无锁、偏向锁、轻量级锁、重量级锁。

发布于: 刚刚阅读数: 3
用户头像

wljslmz

关注

极致主义者,追求技术的路上,勇往直前! 2021.05.24 加入

公众号:网络技术联盟站 👍InfoQ签约作者 👍阿里云社区签约作者 👍华为云 云享专家 👍BOSS直聘 创作王者 👍腾讯课堂创作领航员 博客+论坛:https://www.wljslmz.cn 工程师导航:https://www.wljslmz.com

评论

发布
暂无评论
Java中的自旋锁和适应性自旋锁是什么意思?其分类依据是啥?_Java_wljslmz_InfoQ写作社区