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算法。

     
  • 相关阅读:
    leetcode 70 Climbing Stairs ----- java
    leetcode 69 Sqrt(x) ---java
    leetcode 68 Text Justification ----- java
    如何把iOS代码编译为Android应用
    OpenSource.com 评出 2014 年十佳开源软件
    js singleton
    Java NIO
    WPAD 的原理及实现
    WebKit JavaScript Binding添加新DOM对象的三种方式
    react
  • 原文地址:https://www.cnblogs.com/huangyichun/p/6852864.html
Copyright © 2011-2022 走看看