http://blog.csdn.net/bingjing12345/article/details/8651429

java.util.concurrent.atomic 包提供了若干个类能实现对int,long,boolean,reference的几个特殊方法非阻塞原子性,这一系列类的主要基于以下两点 

1.volatile修饰变量,保证get()/set()的原子性 
2.利用系统底层的CAS原语来实现非阻塞的其它方法原子操作 

    public final int getAndIncrement() {
        for (;;) {
1            int current = get();                                          
2            int next = current + 1;
3          if (compareAndSet(current, next))
                return current;
        }
    }

单看这段 代码 别说 保证原子性 即使+1 ,他都很难保证, 因为根本没有更新value 的操作

 

重点在于compareAndSet() 函数

compareAndSet

public final boolean compareAndSet(int expect,
                                   int update)
如果当前值 == 预期值,则以原子方式将 当前值 设置为给定的更新值。

 

参数:
expect - 预期值
update - 新值
返回:
如果成功,则返回 true。返回 False 指示实际值与预期值不相等。

 

该函数 只有两个参数,可操作的确实三个值 ,即 value ,expect, update. 他使用了 由硬件保证原子性的指令 CAS (compare and swap)。


 

compareAndSet  函数保证了 比较,赋值这两步操作可以通过一个原子操作完成。

 

 

然后看整个函数, 所有代码被放到了一个循环里面, 如果compareAndSet()执行失败,则说明 在int current = get(); 以后,其他线程对value进行了更新, 于是就循环一次,重新获取当前值,直到compareAndSet()执行成功为止。

 

综上,getAndIncrement() 方法并不是原子操作。 只是保证了他和其他函数对 value 值得更新都是有效的。

他所利用的是基于冲突检测的乐观并发策略。 可以想象,这种乐观在线程数目非常多的情况下,失败的概率会指数型增加。