美文网首页
每日一题 2020-03-25 聊聊Java里的那把锁——自旋锁

每日一题 2020-03-25 聊聊Java里的那把锁——自旋锁

作者: NoelleMu | 来源:发表于2020-03-25 15:10 被阅读0次

今天我们来聊聊自旋锁。

自旋锁(Spin Lock)是一种非互斥锁,也就是说,在一个线程没有获得锁时,它不会阻塞,而是一直在不断地循环(如执行无意义的汇编指令、空循环等,称为“自旋”)并尝试获取锁。由于这种锁在线程尝试获取锁的时候有自旋的过程,所以称为自旋锁。自旋锁实际上是一种“忙碌等待”机制。

Java中的自旋锁又叫“轻量级锁”,是比偏向锁重、比重量级锁轻的一种锁。Java的自旋锁依赖于原子性操作CAS(Compare And Swap / Compare And Exchange)。CAS是由操作系统定义的,由若干原子指令组成,其中最重要的是cmpxchg指令。CAS的大致过程如图所示,目前我们不用太深究,只要知道有这么一回事就可以了。

CAS的大致流程

CAS有一个问题是ABA问题,简单来说就是如果一个值原来是A,后来变成了B, 后来又变成了A,CAS会认为没有发生变化,但是实际上已经发生了变化。Java是使用JDK1.6引入的AtomicStampedReference来解决这个问题的。

总之,自旋锁对于线程只会阻塞很短时间的场合是非常有效的,这种情况下自旋锁的效率远高于重量级锁,避免了重量级锁中的用户态与内核态的切换。但是自旋锁也是有一定缺点的,比如有的线程可能一直无法获取到锁,自旋的过程对CPU的消耗比较高等。如果出现线程等待时间过长的情况,就要升级为重量级锁了。

注:从计算机底层来说,自旋锁不适合在单核单线程的CPU上使用。因为自旋锁在线程A获取不到锁时并不会挂起而是一直处于活跃状态,此时真正持有锁的线程B无法执行,它只能等A的时间片结束才能继续运行,这种情况下使用自旋锁的效率很低。

相关文章

网友评论

      本文标题:每日一题 2020-03-25 聊聊Java里的那把锁——自旋锁

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