//以原子方式将当前值加1。相当于线程安全版本的i++操作。 publicfinalintgetAndIncrement() { for (;;) { intcurrent= get(); intnext= current + 1; if (compareAndSet(current, next)) return current; } }
//以原子方式将当前值减 1相当于线程安全版本的i--操作。 publicfinalintgetAndDecrement() { for (;;) { intcurrent= get(); intnext= current - 1; if (compareAndSet(current, next)) return current; } }
//以原子方式将给定值与当前值相加。相当于线程安全版本的操作。 publicfinalintgetAndAdd(int delta) { for (;;) { intcurrent= get(); intnext= current + delta; if (compareAndSet(current, next)) return current; } }
//以原子方式将当前值加 1相当于线程安全版本的++i操作。 publicfinalintincrementAndGet() { for (;;) { intcurrent= get(); intnext= current + 1; if (compareAndSet(current, next)) return next; } }
//以原子方式将当前值减 1。相当于线程安全版本的--i操作。 publicfinalintdecrementAndGet() { for (;;) { intcurrent= get(); intnext= current - 1; if (compareAndSet(current, next)) return next; } }
//以原子方式将给定值与当前值相加。实际上就是等于线程安全版本的i=i+delta操作 publicfinalintaddAndGet(int delta) { for (;;) { intcurrent= get(); intnext= current + delta; if (compareAndSet(current, next)) return next; } }
}
通过源码可以发现,AtomicInteger并没有使用Synchronized关键字实现原子性,几乎所有的数据更新都用到了compareAndSet(int expect, int update)这个方法。那么就不难看出AtomicInteger这个类的最核心的函数就是compareAndSet(int expect, int update)。
那么compareAndSet(int expect, int update)是干什么的呢????
我们以getAndIncrement()方法为例,它的源码如下:
1 2 3 4 5 6 7
for (;;) { intcurrent= get(); intnext= current + 1; if (compareAndSet(current, next)) return current; } }
==单看这段 代码 很难保证原子性, 因为根本没有更新value 的操作==
重点在于compareAndSet() 函数
public final boolean compareAndSet(int expect,int update)