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