zoukankan      html  css  js  c++  java
  • CAS算法

     1 /**
     2  * CAS(Compare-And-Swap)算法保证了数据的原子性
     3  *          CAS算法是硬件对于并发操作共享数据的支持
     4  *          CAS包含了3个操作数:
     5  *          内存值 V  看成两步 读取内存值为1步
     6  *
     7  *          预估值 A  后面两步同时发生
     8  *          更新值 B
     9  *          当且仅当V == A时,V = B,否则不做任何操作
    10  * 下面用Java锁模拟CAS算法:
    11  */
    12 public class CAS {
    13 
    14 
    15     private int value =0;
    16 
    17     public CAS() {
    18     }
    19     public CAS(int value) {
    20         this.value = value;
    21     }
    22 
    23     public synchronized int getValue() {
    24         return value;
    25     }
    26 
    27     private synchronized int compareAndSwap(int expectedValue, int newValue){
    28         int oldValue = value;
    29         if(oldValue == expectedValue)
    30             value = newValue;
    31         return oldValue;
    32     }
    33 
    34     public synchronized boolean compareAndSet(int expected, int newValue){
    35         return expected == compareAndSwap(expected, newValue);
    36     }
    37 }

    下面对于上面的CAS算法进行测试:

     1 package volatile_1;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class Test {
     7 
     8     private CAS cas = new CAS();
     9     @org.junit.Test
    10     public void Test() {
    11         List<Thread> threadList = new ArrayList<>();
    12         for(int i=0; i<100; ++i){//100个线程
    13             Thread t = new Thread(()->{
    14                 for(int j=0; j < 10000; ++j){//每个线程将value值+10000
    15                     count();
    16                 }
    17             });
    18             threadList.add(t);
    19         }
    20 
    21         threadList.forEach(Thread::start);//启动线程
    22         threadList.forEach(t->{//等待所有线程执行结束
    23             try {
    24                 t.join();
    25             } catch (InterruptedException e) {
    26                 e.printStackTrace();
    27             }
    28         });
    29         System.out.println(cas.getValue());//打印value值,理论上为1000000
    30     }
    31 
    32     /**
    33      * 修改cas中的值
    34      */
    35     private void count(){
    36         while(true){
    37             int i= cas.getValue();
    38             boolean suc = cas.compareAndSet(i, ++i);//每次加一
    39             if(suc)
    40                 break;
    41         }
    42     }
    43 }

    结果为:

    1000000

    说明通过Java代码模拟了CAS算法。

     
  • 相关阅读:
    升级Node和Calico
    K8S在原有的集群上新增node节点(v1.19.5)
    Django的quickstart
    Jenkins配置python自动化点检项目
    Django的ORM一对多查询及联合查询
    Django的ORM查询
    mac系统安装mysqlclient的一些坑(附解决方法)
    tomcat中Context标签使用
    pipline语法
    android----AndroidViewModel访问SharedPreference,重启手机数据也存在
  • 原文地址:https://www.cnblogs.com/huangyichun/p/6852864.html
Copyright © 2011-2022 走看看