首页 > 代码库 > CAS算法
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 =http://www.mamicode.com/0; 16 17 public CAS() { 18 } 19 public CAS(int value) { 20 this.value =http://www.mamicode.com/ 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 =http://www.mamicode.com/ value; 29 if(oldValue =http://www.mamicode.com/= expectedValue) 30 value =http://www.mamicode.com/ 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算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。