面试知识点学习6——CAS操作

CAS操作

6.1 CAS操作过程

面试知识点学习6——CAS操作_第1张图片

6.2 CAS带来的问题

6.2.1 ABA问题

面试知识点学习6——CAS操作_第2张图片

image.png

6.2.2 自旋浪费大量的处理器资源

与线程阻塞相比,自旋会浪费大量的处理器资源。这是因为当前线程仍处于运行状况,只不过跑的是无用指令。它期望在运行无用指令的过程中,锁能够被释放出来。

例如:阻塞相当于熄火停车,自旋状态相当于怠速停车。在十字路口,如果红绿灯等待的时间非常长,那么熄火相对省油一些;如果红绿灯的等待时间非常短,怠速停车更合适。

然而,对于JVM来说,它并不能看到红灯的剩余时间,也就没法根据等待时间的长短来选择是自旋还是阻塞。JVM给出的方案是自适应自旋,根据以往自旋等待时能否获取锁,来动态调整自旋的时间。即如果在自旋的时候获取到锁,则会增加下一次自旋的时间,否则就稍微减小下一次自旋时长,对于我们的例子就是:如果之前不熄火等待了绿灯,那么这次不熄火的时间就长一点;如果之前不熄火没等待绿灯,那么这次不熄火的时间就短一点。

6.2.3 CAS带来的公平性问题

自旋状态带来另外一个副作用——不公平的锁机制。处于阻塞状态的线程无法立刻竞争被释放的锁。然而处于自旋状态的线程,则很有可能优先获得这把锁。

你可能感兴趣的:(java)