多线程与高并发——CAS

CAS

啥是CAS?

CAS又称为无锁优化、自旋、乐观锁,全称为Compare And Set CAS可以理解为一个方法,cas(要改动的值,期望的值,要变成的新值) 如果我当前的值等于期望的值了,那么就设置为新的值,否则就重新尝试或者失败了 CAS是CPU的原语支持,是CPU指令上的支持,中间不能被打断!所以cas是能保证线程安全的。

CAS的流程

    cas(V,Expected,NewValue)   if V==E   V = New  otherwise try again for fail

CAS可能导致的问题

    CAS操作 会导致ABA问题 例如:假如有一个值是1,想变成2,拿到1之后,通过cas操作放进去,如下图   如果没有其他线程来操作,那么没什么问题,可以正确修改,但是假设此时有其他的一个线程来改动了,比如先把1改成2,再把2改成1,此时不影响CAS的操作,因为此时是int基础类型这种,无所谓的,最后只需要得到2即可,但是如果是bean这种class类的形式,可能就会导致再要改变的对象已经不是原来的对象的情况   打个比方,你的女朋友就是cas,你就是要改变的变量,你俩分手又复合了,但是可能你中间又经历了别的女人,此时的你已经不是当时的你了,对于这种问题的解决方法如下:   可以给CAS加上版本号(version),例如A 1.0,B 2.0,C 3.0->cas(version)
经验分享 程序员 微信小程序 职场和发展