解决方案 »

  1.   

    int current = get();
    int next = current + delta;这个加操作不具有原子性。因为在jvm会先得到current和delta,然后计算他的值,写入内存。如果多个线程调用这个方法,如果在一个线程计算加运行的时候被中断,另外一个线程开始运行并把结果写入内存,这时候线程又被唤醒,又会把结果写入内存,这样next的值就不对了。
      

  2.   

    AtomicInteger 中这个方法之所以是原子的,因为其中最关键的一个方法:compareAndSet,即 CAS(比较并设置)操作。这个方法的实现是将期望值与实际值进行比较,如果相同则返回 true 表示当前值没有被修改过。compareAndSet 这个方法直接使用一个 CPU 指令操作完成的,因此其是原子性的。CAS 有两个含义:比较并交换、比较并设置,都简称 CAS,但其内部原理基本上是一样的,参考 wiki 上的说明:http://en.wikipedia.org/wiki/Compare-and-swap
      

  3.   

    这是 原子操作 在 java standard api 中是原子操作
    到了 其他地方 就不是了
    是不是底层专门支持着 这个类
    提供 一个系操作 绝不会中断 
    没看到 源码中 有cpu指令
    是不是 一个源码 和 一个源码 内容一致 反编译字节码 就成为了不一致?
      

  4.   

    如何 看到接口低下的cpu命令
      

  5.   

    直接加操作不是原子性的,直接用.concurrent.里面自带的那些操作是原子性的
      

  6.   

    只是#3的 回答
    与问题相符 
    应该是底层cpu 被接口表面掩盖