Java中的自旋锁,手动实现一个自旋锁
Posted 鱼找水需要时间
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的自旋锁,手动实现一个自旋锁相关的知识,希望对你有一定的参考价值。
自旋锁
CAS是实现自旋锁的基础,CAS利用CPU指令保证了操作的原子性,已达到锁的效果。自旋是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁, 当线程发现锁被占用时,会不断循环判断锁的状态,直到获取。这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。
自旋锁 & 非自旋锁
什么是自旋?字面意思是 “自我旋转” 。在 Java 中就是循环的意思,比如 for 循环,while 循环等等。那自旋锁顾名思义就是「线程循环地去获取锁」。
非自旋锁,也就是普通锁。获取不到锁,线程就进入阻塞状态。等待 CPU 唤醒,再去获取。
自旋锁 & 非自旋锁的执行流程
某线程去获取锁(可能是自旋锁 or 非自旋锁),然而锁现在被其他线程占用了。它两获取锁的执行流程就如下图所示:
- 自旋锁:一直占用 CPU 的时间片去循环获取锁,直到获取到为止。
- 非自旋锁:当前线程进入阻塞,CPU 可以去干别的事情。等待 CPU 唤醒了,线程才去获取非自旋锁。
自旋锁有啥好处?
- 阻塞 & 唤醒线程都是需要资源开销的,如果线程要执行的任务并不复杂。这种情况下,切换线程状态带来的开销比线程执行的任务还要大。
- 而很多时候,我们的任务往往比较简单,简单到线程都还没来得及
以上是关于Java中的自旋锁,手动实现一个自旋锁的主要内容,如果未能解决你的问题,请参考以下文章