Python 官方文档:入门教程 => 点击学习
目录1.自旋锁2.工作流程3.缺点4.实现原理5.自适应自旋前言: 阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容
前言:
阻塞或唤醒一个Java
线程需要操作系统切换CPU
状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换消耗的时间有可能比用户代码执行的时间还要长。
在有些场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失。
如果机器有多个CPU核心,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU
的执行时间,看看持有锁的线程是否很快就会释放锁。
为了让当前线程“稍等一下”,我们需让当前线程进行自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程就可以不必阻塞而是直接获取同步资源,从而避免切换线程的开销。这就是自旋锁。
自旋锁本身是有缺点的,它不能代替阻塞。自旋等待虽然避免了线程切换的开销,但它要占用处理器时间。
所以,自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数没有成功获得锁,就应当挂起线程。(这个次数默认是10次,可以配置)
自旋锁的实现原理同样也是CAS,AtomicInteger
中调用unsafe
进行自增操作的源码中的do-while
循环就是一个自旋操作,如果修改数值失败则通过循环来执行自旋,直至修改成功。
public final int getAndAddInt (Object var1, Long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while( !this.compareAndSwapint(var1, var2, var5, var5 + var4));
return var5;
}
自适应意味着自旋的时间(次数)不固定,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。
到此这篇关于什么是Java自旋锁的文章就介绍到这了,更多相关Java自旋锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: 什么是Java自旋锁
本文链接: https://lsjlt.com/news/161465.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0