CAS原理
CAS 即 COMPARE AND SET的缩写。多线程资源竞争的一种解决办法,适当情况下可代替锁,可能提高新能。
说明:
memoryValue 内存中值
expectedValue 期望值
newValue 更新的值
如果memoryValue = expectedValue,则将memoryValue更新为newValue。否则不更新。
例如:
AtomicInteger类中方法方法即是使用此算法实现。
public final boolean compareAndSet(int expectedValue, int newValue) {
return U.compareAndSetInt(this, VALUE, expectedValue, newValue);
}
问题:
1 如果在线程1记录下内存A的值为val1,执行计算的过程中,内存A被线程2更新成了val2,之后又更新成val1,即连续更新了两次,此时线程1再更新内存A的值的时候应该成功还是失败?实际情况是,在只关心结果的情况时完全应该成功更新,但是这个过程中确实发生了更新(特别如果内存A中的值时引用的话,影响可能会很大)。此时,可以增加标志,如版本号标识记录每次操作予以解决。
2 如果并发量很大,那么操作可能长时间不成功。反而造成新能下降,视具体情况可以将线程分批次执行、修改程序缩短每个线程的执行时长、修改业务逻辑等等方式。