重量级锁竞争的时候,还可以使用自旋来优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞(阻塞就以为着你的线程要发生上下文切换)。
自旋适用于有多核CPU的情况
自旋重试成功的情况
自旋重试失败的情况
- 在Java 6 之后自旋转是自适应的,比如对象刚刚的一次自旋操作成功过,那么认为这次自旋成功的可能性会高,就多自旋几次;反之,就少自旋甚至不自旋,总之,比较智能
- 自旋会占用CPU时间,单核CPU自旋就是浪费,多核CPU自旋才能发挥优势
- Java 7 之后不能控制是否开启自旋功能