日期:2014-05-20  浏览次数:20772 次

加操作是原子操作吗
public final int getAndAdd(int delta) {
        for (;;) {
            int current = get();
            int next = current + delta;
            if (compareAndSet(current, next))
                return current;
        }
    }
这在java.util.concurrent.atomic.AtomicInteger 是原子操作
以相同的形式 重写 还是原子操作吗
仅仅尝试 任何加操作 感觉都不是 原子操作
何况 一个线程进入for 另一个线程就可能紧随其后
so why?
------解决方案--------------------
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
------解决方案--------------------
直接加操作不是原子性的,直接用.concurrent.里面自带的那些操作是原子性的