CAS算法

CAS算法实现

  • CAS (Compare And Swap):由硬件实现的。

  • CAS 可以将 read-modify-write 这类的操作转换为原子操作。

  • i++ 自增操作包括三个自操作:

    • 从主内存读取 i 变量的值

    • 对 i 的值加1

    • 在把加1之后的值保存到主内存

  • CAS原理:在把数据更新到主内存的时候,再次读取主内存变量的值,如果现在变量的值与期望的值操作起始时读取值)一样就更新。

bfac6c52a20746ecaae32958ea8a56b7.png

 

使用CAS模拟实现计数器

package stu.my.cdn.cas;

/**
 * 使用CAS实现一个线程安全的计数器
 */
public class CASTest {
    public static void main(String[] args) {
        CASCounter casCounter = new CASCounter();
        for (int i = 0; i < 10000; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(casCounter.incrementAndGet());
                }
            }).start();
        }
    }
}

class CASCounter{
    //使用volatile修饰value,使线程可见
    volatile private long value;

    private long getValue(){
        return value;
    }

    //定义 compare and swap方法
    private boolean conpareAndSwap(long expectedValue,long newValue){
        //如果当前线程value的值与期望值expectedValue值一样,就把当前的Value字段替换成newValue值
        synchronized (this){
            if(value == expectedValue){
                value = newValue;
                return true;
            }else{
                return false;
            }
        }
    }

    //定义自增方法
    public long incrementAndGet(){
        long oldValue;
        long newValue;
        do{
            oldValue = value;
            newValue = oldValue+1;
        }while(!conpareAndSwap(oldValue, newValue));
        return value;
    }
}

 

 


版权声明:本文为qq_54864699原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。