AtomicInteger簡(jiǎn)介
- 支持原子操作的Integer類(lèi)
- 主要用于在高并發(fā)環(huán)境下的高效程序處理隔盛。使用非阻塞算法來(lái)實(shí)現(xiàn)并發(fā)控制。
源碼分析
jdk1.7.0_71
//在更新操作時(shí)提供“比較并替換”的作用
private static final Unsafe unsafe = Unsafe.getUnsafe();
//用來(lái)記錄value本身在內(nèi)存的偏移地址
private static final long valueOffset;
//用來(lái)存儲(chǔ)整數(shù)的時(shí)間變量焙矛,這里被聲明為volatile田盈,就是為了保證在更新操作時(shí),當(dāng)前線程可以拿到value最新的值
private volatile int value;
AtomicInteger(int initialValue) 初始化
public AtomicInteger(int initialValue){}
AtomicInteger()
public AtomicInteger(){}
get()獲取當(dāng)前值
public final int get() {
return value;
}
set(int value)設(shè)置值
public final void set(int newValue) {
value = newValue;
}
lazySet(int newValue)
//lazySet延時(shí)設(shè)置變量值帚呼,這個(gè)等價(jià)于set()方法撞羽,但是由于字段是
//volatile類(lèi)型的阐斜,因此次字段的修改會(huì)比普通字段(非volatile
//字段)有稍微的性能延時(shí)(盡管可以忽略),所以如果不是
//想立即讀取設(shè)置的新值诀紊,允許在“后臺(tái)”修改值谒出,那么此方法就很有用。
public final void lazySet(int newValue) {
unsafe.putOrderedInt(this, valueOffset, newValue);
}
getAndSet(int newValue)設(shè)定新數(shù)據(jù),返回舊數(shù)據(jù)
public final int getAndSet(int newValue) {}
compareAndSet(int expect,int update)比較并設(shè)置
public final boolean compareAndSet(int expect, int update) {
//使用unsafe的native方法渡紫,實(shí)現(xiàn)高效的硬件級(jí)別CAS
//native方法
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
weakCompareAndSet(int expect,int update)比較并設(shè)置
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
getAndIncrement()以原子方式將當(dāng)前值加 1到推,相當(dāng)于線程安全的i++操作
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
incrementAndGet( )以原子方式將當(dāng)前值加 1, 相當(dāng)于線程安全的++i操作惕澎。
public final int incrementAndGet() {}
getAndDecrement( )以原子方式將當(dāng)前值減 1莉测, 相當(dāng)于線程安全的i--操作。
public final int getAndDecrement() {}
decrementAndGet ( )以原子方式將當(dāng)前值減 1唧喉,相當(dāng)于線程安全的--i操作捣卤。
public final int decrementAndGet() {}
addAndGet( ): 以原子方式將給定值與當(dāng)前值相加, 實(shí)際上就是等于線程安全的i =i+delta操作八孝。
public final int addAndGet(int delta) {}
getAndAdd( ):以原子方式將給定值與當(dāng)前值相加董朝, 相當(dāng)于線程安全的t=i;i+=delta;return t;操作
public final int getAndAdd(int delta) {}
參考
http://www.itzhai.com/the-introduction-and-use-of-atomicinteger.html#read-more