Java 原子类的操作 AtomicInteger
最近研究 Java 的并發(fā)包,了解到關(guān)于原子類的操作,這里將自己了解到的貼出來功能大家參考一下,有什么不足的地方還望大家指正,及時(shí)更新。
AtomicInteger 是 Java 1.5 開始在 atomic 包提供的可以在多線程條件下安全的訪問和操作 int 數(shù)據(jù)類型的類,之前我們對操作 int 數(shù)據(jù)類型的時(shí)候,通常用 i++、i-- 等操作,但是這樣的操作在多線程下是不安全的,因?yàn)檫@樣的操作并不是原子的,下面我們看看例子:
public class IntegerTest {private static int number = 0;private final ststic int count = 1000000;public static void main(String[] args){Runnable runnable1 = createRunnable();Runnable runnable2 = createRunnable();//這里執(zhí)行 2000000 次new Thread(runnable1).start();new Thread(runnable2).start();try{Thread.sleep(1000);// 打印System.out.println(number);} catch (InterruptedException e) {e.printStackTrace();}}public static Runnable createRunnable(){return ()->{for(int i = 0; i < count; i++){number++;}}} } 復(fù)制代碼經(jīng)測試,最后的打印結(jié)果是:1048708。當(dāng)然,每次打印的值都不一樣,但是這正說明了在多線程下,針對 int 的操作是不安全的。
以后針對這樣的場景可以使用 AotmicInteger 類,它幫助我們解決了多線程下的安全問題,并且提供了更所的操作方法,下面介紹一下這個類的方法介紹:
1、byteValue() —— 這個方法繼承自 Number 類,以 byte 類型返回當(dāng)前值; 2、shortValue() —— 這個方法繼承自 Number 類,以 short 類型返回當(dāng)前值; 3、intValue() —— 這個方法繼承自 Number 類,以 int 類型返回當(dāng)前值; 4、longValue() —— 這個方法繼承自 Number 類,以 long 類型返回當(dāng)前值; 5、floatValue() —— 這個方法繼承自 Number 類,以 float 類型返回當(dāng)前值; 6、doubleValue() —— 這個方法繼承自 Number 類,以 double 類型返回當(dāng)前值;7、getAndIncrement() —— 這個方法先獲取當(dāng)前值,然后再自增 1 (類似 i++); 8、incrementAndGet() —— 這個方法先自增 1 (類似 ++i),然后再返回這個值; 9、getAndIncrement() —— 這個方法先獲取當(dāng)前值,然后再自減 1 (類似 i--); 10、incrementAndGet() —— 這個方法先自減 1 (類似 --i),然后再返回這個值;11、addAndGet(int value) —— 先加上 value,然后返回之后的值; 12、getAndAdd(int value)—— 先獲取當(dāng)前值,然后自己在加上 value;//從這兒我們可以發(fā)現(xiàn)這個類的方法命名很直觀,從名字就能知道這個方法的作用13、compareAndSet(int first, int second) —— 如果當(dāng)前值等于 first,返回 true,同時(shí)將值更新為 second, 否則返回 false,但不會更新; 14、weakCompareAndGet(int first, int second) —— 與 compareAndSet 一樣(源碼是一樣);15、getAndSet(int value) —— 先獲取當(dāng)前值,然后再設(shè)置為 value;16、getAndUpdate(IntUnaryOperator op) —— 這個方法是 Java 1.8 開始提供的,這個方法自身返回當(dāng)前值。 同時(shí)會把 op 的返回值設(shè)置為新值,具體參考 IntUnaryOperator 類,關(guān)于 function 包使用方法以后會介紹; 17、updateAndGet(IntUnaryOperator op) —— 這個方法先將 op 的返回值作為新值,然后返回這個新值;18、getAndAccumulate(int val, IntBinaryOperator op) —— 這個方法返回值,然后將當(dāng)前值和 val 作為參數(shù)傳給 op, 將 op 的返回值設(shè)置為新值; 19、accumulateAndGet(int val, IntBinaryOperator op) —— 這個方法先將當(dāng)前值和 val 作為參數(shù)傳給 op, 將 op 的返回值設(shè)置為新值,然后返回;20、set(int val) —— 設(shè)置; 21、lazySet(int val) —— 設(shè)置(與 set 一樣,區(qū)別暫時(shí)還不知,但實(shí)現(xiàn)方式不一樣)。 復(fù)制代碼以上就是 AtomicInteger 類的全部方法了,但是我在閱讀源碼的時(shí)候還發(fā)現(xiàn)了一些疑惑的地方,比如 getAndAccumulate 方法在內(nèi)部的實(shí)現(xiàn)中循環(huán)調(diào)用了 compareAndSet 方法,這兒有什么必要循環(huán)調(diào)用呢?暫時(shí)還不清楚,但這大概就是我們是我們在探索的道路上越走越遠(yuǎn)的一大動力吧!以后有什么新的發(fā)現(xiàn)會及時(shí)更新,如有人清楚,還望告知。
謝謝大家,請大家持續(xù)關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的Java 原子类的操作 AtomicInteger的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 描述自己心情抑郁的句子185个
- 下一篇: Java高并发秒杀Api-业务分析与DA