Java 中的自旋锁和适应性自旋锁是什么意思?其分类依据是啥?
上一篇文章中,我们提到了锁的分类:
上一篇介绍了乐观锁和悲观锁,它们的分类依据是线程间是否需要锁住资源,需要锁住就是悲观锁,不需要锁住就是乐观锁。
那么本文将带大家了解一下锁的第二个分类:自旋锁和适应性自旋锁,让我们直接开始。
一、自旋锁 vs 适应性自旋锁
这里大家一定很奇怪,既然有自旋锁,不应该有非自旋锁吗?其实,非自旋锁也有,不过这只是一个概念,我们通常情况下的锁都是非自旋锁,但是自旋锁这个锁确实需要单独定义出来。
1.1 自旋锁
自旋锁,从字面意思来看“自旋”,自己在那一直旋转,java 中那么肯定就是自己一直在那判断某种条件,比如我们会用 while 关键字。
那么真正的自旋锁是什么意思呢?
我们知道在多线程的情景下,多个线程去访问资源的时候,操作系统不是说真的在同一时刻去让多个线程同时操作某个资源,这个是不现实的,一般都是控制线程的处理时间点,然后频繁的切换线程,只是说这种切换时间对于我们来说极其的短,几乎感知不到,但是对于操作系统来说就显得很重要了。
那么自旋锁的意思呢,就是一个线程去访问某个资源的时候,发现该资源被前一个线程锁住了,还没有释放锁,这个时候该线程不会立马放弃,而是一直在循环,一直在等前一个线程释放锁,这个就是自旋锁。
1.2 适应性自旋锁
适应性自旋锁不是自旋锁的对立面,而是对自旋锁的优化,刚刚我们提到自旋锁是一直在等待前一个线程释放锁?但是假如前一个线程就是不释放呢?难道要一直等下去吗?我们要知道等待就是阻塞了线程的执行,那么既然是阻塞就会占用 CPU 的资源,就会增加时间,所以怎么办?
一般是限定自旋的次数,比如说自旋 5 次假如前一个线程还没有释放锁,那么干脆就被释放了,直接阻塞得了。
那么适应性自旋锁就是干这样的事的,只是说适应性自旋锁多个“适应性”,有点像 AI,它自己去判断这个锁大概还能锁多长时间,根据这个判断去设定自旋的次数。
1.3 判断依据
从上面对自旋锁和适应性自旋锁的介绍,大家看到最多的关键词事什么?
没错,就是阻塞。
本小节开始就说过了,一般来说大多数锁都是非自旋的,为啥大多数锁不需要自旋?
废话,线程没有被阻塞我自旋它干啥,所以当资源访问失败,即被锁住的时候,需不需要阻塞就成了判断依据了,不需要阻塞,那就是自旋锁,假如还能自行判断自旋次数的,那么就是适应性自旋锁,是不是很简单?
二、总结
本文主要介绍了自旋锁和适应性自旋锁,其分类依据就是当资源访问被锁住的时候,需不需要阻塞,需要阻塞就是自旋锁,如果还能自行判断自旋次数的,那么就是适应性自旋锁。
希望本文对您认识自旋锁和适应性自旋锁有所帮助,在阅读的同时有任何疑问可以在下方评论区与我讨论,下一篇文章,将带您了解一下无锁、偏向锁、轻量级锁、重量级锁。
版权声明: 本文为 InfoQ 作者【wljslmz】的原创文章。
原文链接:【http://xie.infoq.cn/article/faf3ce5d075b668475f2cc2ed】。未经作者许可,禁止转载。
评论