自旋锁
前言
在有些场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失。
如果机器有多个CPU核心,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。
为了让当前线程“稍等一下”,我们需让当前线程进行自旋,如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程就可以不必阻塞而是直接获取同步资源,从而避免切换线程的开销。这就是自旋锁。
缺点
不能代替阻塞。自旋等待虽然避免了线程切换的开销,但它要占用处理器时间。
- 如果锁被占用的时间很短,自旋等待的效果就会非常好;
- 如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器资源。
自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数没有成功获得锁,就应当挂起线程。(这个次数默认是10次,可以配置)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AFlyingSheep's Blog!
评论