CAS(compare-and-swap):比较并交换,依赖于硬件指令集,如果一个变量的值跟期望的值相等就将变量的值替换成新值,并返回旧值,该操作是一个原子操作。
在java中sun.misc.Unsafe类提供了compareAndSwapInt和compareAndSwapLong方法来实现CAS指令。
AtomicInteger就是依赖Unsafe类来实现:
public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return next; } }
如果compareAndSet失败,就说明有修改,通过无限的for循环重新获取值,再次尝试。