眾所周知,AtomicInteger用于多線程下線程安全的數(shù)據(jù)讀寫操作,避免使用鎖同步,底層采用CAS實(shí)現(xiàn),內(nèi)部的存儲值使用volatile修飾,因此多線程之間是修改可見的。
企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴(kuò)展宣傳的重要窗口,一個合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺,成都創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:成都咖啡廳設(shè)計等成都網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷推廣解決方案、網(wǎng)站設(shè)計等建站排名服務(wù)。public AutomicInteger(int initValue): 有參構(gòu)造,初始化為initValue
public AutomicInteger(): 無參構(gòu)造,相當(dāng)于AutomicInteger(0)
2. 自增1public int getAndIncrement(): 返回當(dāng)前值,并自增1
AtomicInteger ai = new AtomicInteger(5);
ai.getAndIncrement(); // 5
ai.get(); // 6
public int incrementAndGet(): 先自增1,再返回自增后的值
3. 自減1?AtomicInteger ai = new AtomicInteger(5);?
ai.incrementAndGet(); // 6
ai.get(); // 6
public int getAndDecrement(): 返回當(dāng)前值,并自減1
AtomicInteger ai = new AtomicInteger(5);
ai.getAndDecrement(); // 5
ai.get(); // 4
public int decrementAndGet(): 自減1,?返回自減后的值
4. 如果原來是A,則更新成B?AtomicInteger ai = new AtomicInteger(5);
ai.decrementAndGet(); // 4
ai.get(); // 4
public boolean compareAndSet(int source, int dest):source是改之前的值,Dest是改之后的值,source與當(dāng)前真實(shí)值匹配了才能執(zhí)行成功,返回值表示是否執(zhí)行成功。
5. 自增/自減N?AtomicInteger ai = new AtomicInteger(10);
ai.compareAndSet(100, 12); // false, 因?yàn)楦闹安皇?00
ai.get(); // 10ai.compareAndSet(10, 12); // true
ai.get(); // 12
public int getAndAdd(int delta): 先獲取當(dāng)前值,再進(jìn)行計算val = val + delta
AtomicInteger ai = new AtomicInteger(10);
ai.getAndAdd(2); // 10ai.get(); // 12
public int addAndGet(int delta): 先計算?val = val + delta,再返回最新值
AtomicInteger ai = new AtomicInteger(10);
ai.addAndGet(2); // 12ai.get(); //?12
當(dāng)然,這個方法也支持負(fù)數(shù)參數(shù),也就意味著可以做減法
AtomicInteger ai = new AtomicInteger(5);
System.out.println(ai.addAndGet(-1)); // 4
6. 硬編碼的二元計算邏輯public int getAndUpdate?(IntUnaryOperator opeartion): 使用lambda表達(dá)式進(jìn)行二元運(yùn)算,獲取到的是舊值。
AtomicInteger ai = new AtomicInteger(10);
ai.getAndUpdate(x ->x + 2); // 10, oldVal
ai.get(); // 12
public int updateAndGet (IntUnaryOperator opeartion): 使用lambda表達(dá)式進(jìn)行二元運(yùn)算,獲取到的是新值。
AtomicInteger ai = new AtomicInteger(10);
ai.updateAndGet(x ->x + 2); // 12, newVal
ai.get(); // 12
當(dāng)然,這里支持減法也同樣沒問題
AtomicInteger ai = new AtomicInteger(5);
System.out.println(ai.updateAndGet(val ->val - 1)); // 4
7.? 非硬編碼的二元運(yùn)算邏輯public int getAndAccumulate(int factor, IntBinaryOperator operation): 先返回舊值,再進(jìn)行計算
AtomicInteger ai = new AtomicInteger(10);
int result = ai.getAndAccumulate(5, new IntBinaryOperator() {@Override public int applyAsInt(int left, int right){ ????????return left + right; } }); // result = 10, 舊值 ai.get(); // 15新值
public int accumulateAndGet(int factor, IntBinaryOperator operation): 先計算,再返回新值
AtomicInteger ai = new AtomicInteger(10);
int result = ai.accumulateAndGet(5, Integer::sum); // 15
ai.get(); // 15
同樣,這個方法的自由度大大提高
int val = -1;
AtomicInteger ai = new AtomicInteger(5);
System.out.println(ai.accumulateAndGet(val, (a, b)->b-a)); // -6
8. 直接賦值public void set(int newVal): 直接更新為新值,區(qū)別于compareAndSet需要比對舊值。
9. 直接取值public int get(): 取最新值
附:
底層的CAS是操作系統(tǒng)級別的實(shí)現(xiàn):
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
自旋式樂觀鎖實(shí)現(xiàn)數(shù)值更新
public final int getAndAddInt(Object object, long valueOffset, int delta) {
int currentValue; do { ????????currentValue= this.getIntVolatile(object, valueOffset); ? } while(!this.compareAndSwapInt(object, valueOffset, currentValue, currentValue + delta)); return currentValue; }
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧