AtomicInteger原理
AtomicInteger 利用 CAS 、volatile 和本地方法来保证原子操作。它有两个重要的参数,一个是 Volatile 修饰的 value,表示要更新的新值;另一个是表示本地旧值的 valueOffSet。它通过本地方法拿到旧值的内存地址,然后通过 CAS 操作将期望值和旧值进行对比,如果相同就更新为新值。由于新值 value 采用 volatile 修饰,volatile 具有可见性,所以可以保证总能拿到该变量的最新值。(引出 CAS 的问题 ——> ABA 如何解决? ——> AtomicStampedReference )
AtomicReference
AtomicReference 可以保证修改对象引用时的线程安全性,也是基于CAS操作,所以也存在ABA问题,解决办法是使用带有时间戳的对象引用:AtomicStampedReference 。
AtomicInteger 的使用案例
import java.util.concurrent.atomic.AtomicInteger;
/**
* AtomicInteger 使用案例
* 用它来替换不安全的 int,默认初始值为0,getAndIncrement 方法只能以 +1 的方式来累加
*/
public class test {
private static AtomicInteger count = new AtomicInteger();
public static class testThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count.getAndIncrement();
}
}
}
public static void main(String[] args) throws InterruptedException {
testThread t = new testThread();
Thread thread1 = new Thread(t);
Thread thread2 = new Thread(t);
thread1.start();
thread2.start();
Thread.sleep(1000);
System.out.println(count);
}
}