AtomicInteger類的使用

AtomicInteger介紹

AtomicInteger是一個提供原子操做的Integer類,經過線程安全的方式操做加減。java

AtomicInteger使用場景

AtomicInteger提供原子操做來進行Integer的使用,所以十分適合高併發狀況下的使用。算法

AtomicInteger源碼部分講解

public class AtomicInteger extends Number implements java.io.Serializable {
    private static final long serialVersionUID = 6214790243416807050L;

    // setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value;

這裏, unsafe是java提供的得到對對象內存地址訪問的類,註釋已經清楚的寫出了,它的做用就是在更新操做時提供「比較並替換」的做用。實際上就是AtomicInteger中的一個工具。安全

valueOffset是用來記錄value自己在內存的編譯地址的,這個記錄,也主要是爲了在更新操做在內存中找到value的位置,方便比較。併發

注意:value是用來存儲整數的時間變量,這裏被聲明爲volatile,就是爲了保證在更新操做時,當前線程能夠拿到value最新的值(併發環境下,value可能已經被其餘線程更新了)。高併發

這裏,咱們以自增的代碼爲例,能夠看到這個併發控制的核心算法:工具

/**
* Atomically increments by one the current value.
*
* @return the updated value
*/
public final int incrementAndGet() {
for (;;) {
//這裏能夠拿到value的最新值
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}

public final boolean compareAndSet(int expect, int update) {
//使用unsafe的native方法,實現高效的硬件級別CAS
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
相關文章
相關標籤/搜索