CAS算法

Posted huangyichun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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算法。

 

以上是关于CAS算法的主要内容,如果未能解决你的问题,请参考以下文章

CAS无锁策略

原子变量与CAS算法

CAS登录后回传除了ticket参数以外的其他自定义参数

CAS算法

非阻塞同步算法与CAS(Compare and Swap)无锁算法

CAS算法