AtomicInteger能够保证硬件上的原子操做java
1.主要原理this
CAS操做
spa
在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不一样,则更新失败, CAS就是Compare and Swap的意思,比较并操做线程
AtomicInteger主要是调用了Unsafe类中的 compareAndSwapInt 方法code
2.源码:blog
public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return next; } }
public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
3.使用
内存
//获取当前的值 public final int get() //取当前的值,并设置新的值 public final int getAndSet(int newValue) //获取当前的值,并自增 public final int getAndIncrement() //获取当前的值,并自减 public final int getAndDecrement() //获取当前的值,并加上预期的值 public final int getAndAdd(int delta)
4.不足之处rem
比较更新的这个值,没法进行判断内存的值是不是被别人更改过以后,再更改回来的,get
例子:源码
线程1 先将data读入0,进行加工,加工以后数据为2
线程2 也读入data0, 进行加工,加工以后数据为1
现场3 也读入data1, 进行加工,加工以后数据为0
若线程1先开启。可是最后结束,那么进行 data预期值与内存中值进行比较的时候,就会有问题,由于内存中的数据data 0 已经不是线程1读取的时候的那个 data0 ,可是这个没法进行判断
这个不足之处的解决,能够使用:AtomicStampedReference