赞
踩
CAS是compare and swap(比较并交换)的缩写,在并发算法时用来保证更新数据原子性的操作,本质是一条CPU原子指令,不会造成所谓的数据不一致问题,Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg;
执行cmpxchg指令时,会判断当前系统是否为多核系统,若是的话会给总线加锁,只有一个线程会对总线加锁成功,加锁后执行cas操作。
CAS包含三个操作数:内存位置原值(A)、预期原值(B)及要更新值(C);
执行CAS操作时,将内存位置的值(A)与预期原值(B)比较,若匹配,处理器会将内存位置的值更新为新值(若A = B,则A —>C),若不匹配,则处理器不做任何操作;多个线程同时执行CAS操作时只有一个会成功去,其他不成功的线程可以重新不断尝试CAS(这种情况叫做 自旋)或是放弃更新。
CAS算法实现是比较当前内存位置值A与预期当前位置值B是否相同,从而判断当前要修改的位置是否被其他线程修改过了的方式来保证修改操作的原子性。
底层源码中,若是CAS失败,会一直自旋尝试,若是CAS长时间不成功,可能给CPU带来很大的开销;
使用CAS算法,可能会出现线程1、2同时进行CAS操作,线程1极其快的将原内存值A修改为B,紧接着线程3也进行CAS操作,抢在线程2前将内存原值从B改回A,接着线程2进行了CAS操作,发现内存原值与他的预期值一致是A,固也操作成功了,此时就出现了ABA问题,不能够保证数据的原子性。
带上版本号:在每次修改操作后都将版本号+1,在对比内存原值时将版本号也进行比对,都相同才进行修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。