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算法的主要内容,如果未能解决你的问题,请参考以下文章