int current = get(); int next = current + delta;这个加操作不具有原子性。因为在jvm会先得到current和delta,然后计算他的值,写入内存。如果多个线程调用这个方法,如果在一个线程计算加运行的时候被中断,另外一个线程开始运行并把结果写入内存,这时候线程又被唤醒,又会把结果写入内存,这样next的值就不对了。
AtomicInteger 中这个方法之所以是原子的,因为其中最关键的一个方法:compareAndSet,即 CAS(比较并设置)操作。这个方法的实现是将期望值与实际值进行比较,如果相同则返回 true 表示当前值没有被修改过。compareAndSet 这个方法直接使用一个 CPU 指令操作完成的,因此其是原子性的。CAS 有两个含义:比较并交换、比较并设置,都简称 CAS,但其内部原理基本上是一样的,参考 wiki 上的说明:http://en.wikipedia.org/wiki/Compare-and-swap
int next = current + delta;这个加操作不具有原子性。因为在jvm会先得到current和delta,然后计算他的值,写入内存。如果多个线程调用这个方法,如果在一个线程计算加运行的时候被中断,另外一个线程开始运行并把结果写入内存,这时候线程又被唤醒,又会把结果写入内存,这样next的值就不对了。
到了 其他地方 就不是了
是不是底层专门支持着 这个类
提供 一个系操作 绝不会中断
没看到 源码中 有cpu指令
是不是 一个源码 和 一个源码 内容一致 反编译字节码 就成为了不一致?
与问题相符
应该是底层cpu 被接口表面掩盖