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

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

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

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

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

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

1.1 自旋锁

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

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

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

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

1.2 适应性自旋锁

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

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

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

扫描二维码关注公众号,回复: 16001892 查看本文章

1.3 判断依据

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

没错,就是阻塞

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

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

二、总结

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

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

猜你喜欢

转载自blog.csdn.net/weixin_43025343/article/details/132012520
今日推荐