無鎖atomicInteger

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

相關文章
相關標籤/搜索