CAS操作
6.1 CAS操作过程
6.2 CAS带来的问题
6.2.1 ABA问题
6.2.2 自旋浪费大量的处理器资源
与线程阻塞相比,自旋会浪费大量的处理器资源。这是因为当前线程仍处于运行状况,只不过跑的是无用指令。它期望在运行无用指令的过程中,锁能够被释放出来。
例如:阻塞相当于熄火停车,自旋状态相当于怠速停车。在十字路口,如果红绿灯等待的时间非常长,那么熄火相对省油一些;如果红绿灯的等待时间非常短,怠速停车更合适。
然而,对于JVM来说,它并不能看到红灯的剩余时间,也就没法根据等待时间的长短来选择是自旋还是阻塞。JVM给出的方案是自适应自旋,根据以往自旋等待时能否获取锁,来动态调整自旋的时间。即如果在自旋的时候获取到锁,则会增加下一次自旋的时间,否则就稍微减小下一次自旋时长,对于我们的例子就是:如果之前不熄火等待了绿灯,那么这次不熄火的时间就长一点;如果之前不熄火没等待绿灯,那么这次不熄火的时间就短一点。
6.2.3 CAS带来的公平性问题
自旋状态带来另外一个副作用——不公平的锁机制。处于阻塞状态的线程无法立刻竞争被释放的锁。然而处于自旋状态的线程,则很有可能优先获得这把锁。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。