《深入理解Java虚拟机 JVM高级特性与最佳实践》读书笔记--

2020-05-08  本文已影响0人  劉胡來

请求锁的线程(假设为线程A)再未获得锁的时候,不进入阻塞状态,而是让它「再执行一会」即占用CPU一会,看看持有锁的线程是否很快释放锁资源。但是为了让这个线程A进入「等待」的状态,需要让它执行一个忙循环(自旋),这项技术称为自旋锁。

  • 线程A的状态切换是由系统进行的,而这个过程则会消耗系统资源的,如果请求锁的「忙循环」时在一个很小的时间片之内就得到锁,就能提升线程A的执行效率,至少节约了由系统进行的线程A由阻塞状态--->运行状态的时间。
  • 反之如果线程A 在执行「忙循环」时迟迟得不到锁资源,那么就会造成这个「忙循环」占用大量的cpu资源。
  • 自旋锁本身是有缺点的,它不能代替阻塞。自旋等待虽然避免了线程切换的开销,但它要占有处理器的时间,如果锁被占有的时间很短,自旋等待的效果就会非常好。反之,如果锁被占用的时间很长,那么自旋的线程只会白浪费处理器资源。所以,自旋等待的时间必须要有一定的限度,如果自旋超过了限定次数(默认是10次)没有成功获得锁,就应当挂起线程。
image.png
上一篇 下一篇

猜你喜欢

热点阅读