什么是CAS

CAS即compare And SwapInt 就是字面意思比较与替换。

假设有N个线程,要对一个变量进行更改,
第一个线程:拿到源值做备份简称A,要对源值进行替换或改变的值简称B,比较A与B 若为true则用B替换源值,若为false则不操作。

(第二第三个线程同时对其进行更改)
第二个线程:拿到源值备份简称A,要对源值进行替换或改变的值简称B,这个时候第三个线程比它更快已经提交了更改后的值。A与B比较为false 就代表该值已经被另一个线程改动,则需要进行自旋操作(从头开始再来一遍)自旋次数可以设置,当到了一定次数则放弃,这个时候说明并发数已经非常高了需要变换策略了。

将要更改的值封装为一个对象,对象中拥有change_count INT值,记录更改次数(版本号),更改成功则自增,失败则不做修改。

class CAS {

// 内存值

private volatile int value;

// 获取内存值
public synchronized int getValue() {
    return value;
}

//无论更新成功还是失败,都会返回旧的内存值
public synchronized int compareAndSwap(int expectedValue, int newValue) {

    int oldValue = value;

    if (oldValue == expectedValue) {

        this.value = newValue;
    }
    return oldValue;
}
//判断更新是否成功,如果更新成功,旧的内存值会和预估值相等
public synchronized boolean compareAndSet(int expectedValue, int newValue) {
           //判断预估值是否等于内存值
    return expectedValue == compareAndSwap(expectedValue, newValue);
}

}
public class TestCAS {
public static void main(String[] args) {
CAS cas = new CAS();
//创建10个线程来模拟多线程环境
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int i =0;
//设置预估值
while (i<5){
int expectedValue = cas.getValue();
boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 101));

                System.out.println(Thread.currentThread().getName()+"第"+i+"次自旋"+b);
                    if(!b){
                        i++;
                        continue;
                    }break;
            }}
        }).start();
    }
}

}

posted @ 2020-09-20 17:15  蓝冰nine  阅读(505)  评论(0)    收藏  举报