加操作是原子操作吗
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.里面自带的那些操作是原子性的