Java中的自旋锁,手动实现一个自旋锁

自旋锁

CAS是实现自旋锁的基础,CAS利用CPU指令保证了操作的原子性,已达到锁的效果。自旋是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁, 当线程发现锁被占用时,会不断循环判断锁的状态,直到获取。这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

自旋锁 & 非自旋锁

什么是自旋?字面意思是 “自我旋转” 。在 Java 中就是循环的意思,比如 for 循环,while 循环等等。那自旋锁顾名思义就是「线程循环地去获取锁」。

非自旋锁,也就是普通锁。获取不到锁,线程就进入阻塞状态。等待 CPU 唤醒,再去获取。

自旋锁 & 非自旋锁的执行流程

某线程去获取锁(可能是自旋锁 or 非自旋锁),然而锁现在被其他线程占用了。它两获取锁的执行流程就如下图所示:

在这里插入图片描述

  • 自旋锁:一直占用 CPU 的时间片去循环获取锁,直到获取到为止。
  • 非自旋锁:当前线程进入阻塞,CPU 可以去干别的事情。等待 CPU 唤醒了,线程才去获取非自旋锁。

自旋锁有啥好处?

  • 阻塞 & 唤醒线程都是需要资源开销的,如果线程要执行的任务并不复杂。这种情况下,切换线程状态带来的开销比线程执行的任务还要大。
  • 而很多时候,我们的任务往往比较简单,简单到线程都还没来得及

猜你喜欢

转载自blog.csdn.net/weixin_43847283/article/details/128428971