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 如果并发量很大,那么操作可能长时间不成功。反而造成新能下降,视具体情况可以将线程分批次执行、修改程序缩短每个线程的执行时长、修改业务逻辑等等方式。

 

posted @ 2019-11-11 09:54  纵马天涯  阅读(144)  评论(0编辑  收藏  举报