Java 模拟 CAS 算法
CAS 简介
- CAS(Compare-And-Swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。
- CAS 是一种无锁的非阻塞算法的实现。
- CAS 包含了3个操作数
需要读写的内存值:V
进行比较的值即期望的旧值:A
拟写入的新值:B
- 当且仅当 V 的值等于 A 的值是,CAS 通过原子方式用新值 B 来更新 V 的值,否则不会执行任何操作。
CAS 算法 Java 实现
package top.simba1949; public class TestCompareAndSwap { public static void main(String[] args) { final CompareAndSwap cas = new CompareAndSwap(); for (int i = 0; i < 100; i++){ new Thread(new Runnable() { public void run() { int expectedValue = cas.get(); boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 100)); System.out.println(b); } }).start(); } } } class CompareAndSwap{ private int value; /** * 获取内存值 * @return */ public synchronized int get(){ return this.value; } /** * 比较,如果内存的旧值和期望的旧值相等,将更新旧值 * @param expectedValue * @param newValue * @return */ public synchronized int compareAndSwap(int expectedValue, int newValue){ // 取旧值 int oldValue = value; System.out.println("内存值:" + oldValue + ",预估值:" + expectedValue + ",新值:" + newValue); if (expectedValue == oldValue){ this.value = newValue; } return oldValue; } /** * 无论赋值成功与否,返回旧值和期望值是否相等的结果,true 为成功,false 为失败 * @param expectedValue * @param newValue * @return */ public synchronized boolean compareAndSet(int expectedValue, int newValue){ return expectedValue == compareAndSwap(expectedValue, newValue); } }