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