浅谈CAS

前言:前文讨论了volatile保证工作内存和主内存之间的数据一致性问题(可见性),但是运算的原子性没有保证,那么使用CAS就可以用来解决这个原子性运算问题。

  CAS,即Compare And Swap,是一种典型乐观锁的实现。来自大佬的定义:CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。Java中有自带的原子类数据类型,例如AtomicInteger,调用unsafe包实现。

  

public class CASDemo {
public static AtomicInteger i = new AtomicInteger(0);
private static final int THREADS_COUNT = 20;

private static void inCrease() {
i.incrementAndGet();
}

public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[THREADS_COUNT];
CountDownLatch countDownLatch = new CountDownLatch(THREADS_COUNT);
for (int j = 0; j < THREADS_COUNT; j++) {
threads[j] = new Thread(new Runnable() {
@Override
public void run() {
for (int k = 0; k < 10000; k++) {
inCrease();
}
countDownLatch.countDown();
}
});
threads[j].start();
}
countDownLatch.await();
System.out.println(i);
}

}
此时输出结果为200000,

    

 

上一篇:《ANTLR 4权威指南》——1.2 运行ANTLR并测试识别程序


下一篇:VisualState“视图状态”使用心得