1. private AtomicInteger cnt = new AtomicInteger();
    2. public void add() {
    3. cnt.incrementAndGet();
    4. }

    以下代码是 incrementAndGet() 的源码,它调用了 Unsafe 的 getAndAddInt() 。

    1. public final int incrementAndGet() {
    2. return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    3. }

    以下代码是 getAndAddInt() 源码,var1 指示对象内存地址,var2 指示该字段相对象内存地址的偏 移,var4 指示操作需要加的数值,这里为 1。通过 getIntVolatile(var1, var2) 得到旧的预期值,通过调用 compareAndSwapInt() 来进行 CAS 比较,如果该字段内存地址中的值等于 var5,那么就更新内存地址 为 var1+var2 的变量为var5+var4。
    可以看到 getAndAddInt() 在一个循环中进行,发生冲突的做法是不断的进行重试。

    1. public final int getAndAddInt(Object var1, long var2, int var4) {
    2. int var5;
    3. do {
    4. var5 = this.getIntVolatile(var1, var2);
    5. } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
    6. return var5;
    7. }