多线程与高并发——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)
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
线程安全——synchronized