日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AtomicIntegerArray和AtomicIntegerFieldUpdater

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtomicIntegerArray和AtomicIntegerFieldUpdater 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

AtomicIntegerArray

對(duì)int數(shù)組中元素的操作不是原子性的,所以存在并發(fā)操作時(shí),我們應(yīng)該使用AtomicIntegerArray類來代替int數(shù)組。
下面是驗(yàn)證演示代碼:

public class AtomicIntegerArrayDemo {static AtomicIntegerArray aiArr = new AtomicIntegerArray(5);static int[] intArr = new int[5];/*** 并發(fā)測(cè)試,對(duì)數(shù)組的每個(gè)元素進(jìn)行遞增操作*/public static void main(String[] args) throws InterruptedException {ExecutorService threadPool = Executors.newCachedThreadPool();for(int t = 0; t < 5; t++) {threadPool.execute(() -> {for (int i = 0; i < 1000000; i++) {aiArr.getAndIncrement(i % 5);}});threadPool.execute(() -> {for (int i = 0; i < 1000000; i++) {intArr[i % 5]++;}});}threadPool.shutdown();boolean b = threadPool.awaitTermination(5, TimeUnit.SECONDS);if(b) {System.out.println("aiArr:" + aiArr.toString());System.out.println("intArr:" + Arrays.toString(intArr));}else{System.out.println("time out.");}} }

運(yùn)行結(jié)果:

D:\Java\jdk1.8.0_171\bin\java.exe "-javaagent:D:\JetBrains\IntelliJ IDEA aiArr:[1000000, 1000000, 1000000, 1000000, 1000000] intArr:[892703, 891096, 892369, 892372, 893754]

AtomicIntegerArray的常用方法:

//獲取數(shù)組長度 int length()//獲取數(shù)組中下標(biāo)為i的元素的值 int get(int i)//設(shè)置數(shù)組中下標(biāo)為i的元素的值為newValue void set(int i, int newValue)//設(shè)置數(shù)組中下標(biāo)為i的元素的值為newValue,返回以前的值 int getAndSet(int i, int newValue)//如果數(shù)組中下標(biāo)為i的元素的值等于入?yún)xpect,則把值修改為update,并返回ture,如果不等則不修改并返回false boolean compareAndSet(int i, int expect, int update)// arr[i]++ int getAndIncrement(int i)// arr[i]-- int getAndDecrement(int i)// ++arr[i] int incrementAndGet(int i)// --arr[i]int decrementAndGet(int i)//數(shù)組中下標(biāo)為i的元素的值加上delta,返回以前的值 int getAndAdd(int i, int delta)//數(shù)組中下標(biāo)為i的元素的值加上delta,返回新的值 int addAndGet(int i, int delta)//1.8新增方法,更新當(dāng)前值,返回以前的值 int getAndUpdate(int i, IntUnaryOperator updateFunction)// 1.8新增方法,更新當(dāng)前值,返回更新后的值 int updateAndGet(int i, IntUnaryOperator updateFunction)// 1.8新增方法,更新當(dāng)前值,返回以前的值 int getAndAccumulate(int i, int x, IntBinaryOperator accumulatorFunction)// 1.8新增方法,更新當(dāng)前值,返回更新后的值 int accumulateAndGet(int i, int x, IntBinaryOperator accumulatorFunction) *** 1.8新增方法演示*/ @Test public void atomicIntegerArrayMethodTest(){AtomicIntegerArray arr = new AtomicIntegerArray(2);arr.set(0, 10);//lambda表達(dá)式中參數(shù)operand表示數(shù)組下標(biāo)為0的元素當(dāng)前值int i1 = arr.getAndUpdate(0, operand -> operand / 2);System.out.println(i1); // result: 10System.out.println(arr.get(0)); // result: 5int i2 = arr.updateAndGet(0, operand -> operand * 3);System.out.println(i2); // result: 15System.out.println(arr.get(0)); // result: 15//lambda表達(dá)式中參數(shù)left表示數(shù)組下標(biāo)為0的元素當(dāng)前值,right表示第二個(gè)參數(shù)2int i3 = arr.getAndAccumulate(0, 2, (left, right) -> left * right);System.out.println(i3); // result: 15System.out.println(arr.get(0)); // result: 30int i4 = arr.accumulateAndGet(0, 2, (left, right) -> left * right);System.out.println(i4); // result: 60System.out.println(arr.get(0)); // result: 60 }

AtomicIntegerFieldUpdater

AtomicIntegerFieldUpdater是用來原子的操作對(duì)象中int類型字段的。 下面是驗(yàn)證演示代碼:

public class AtomicIntegerFieldUpdaterDemo {/*** 并發(fā)測(cè)試,對(duì)Counter的index字段進(jìn)行遞增操作*/public static void main(String[] args) throws InterruptedException {Counter counter1 = new Counter();AtomicIntegerFieldUpdater<Counter> counterIndexFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(Counter.class, "index");Counter counter2 = new Counter();ExecutorService threadPool = Executors.newCachedThreadPool();for(int t = 0; t < 5; t++) {threadPool.execute(() -> {for (int i = 0; i < 1000000; i++) {counter1.index++;}});threadPool.execute(() -> {for (int i = 0; i < 1000000; i++) {counterIndexFieldUpdater.getAndIncrement(counter2);}});}threadPool.shutdown();boolean b = threadPool.awaitTermination(5, TimeUnit.SECONDS);if(b) {System.out.println("counter1.index:" + counter1.index);System.out.println("counter2.index:" + counterIndexFieldUpdater.getAndIncrement(counter2));}else{System.out.println("time out.");}} }class Counter{/** 必須是volatile修飾的 */public volatile int index = 0; }

運(yùn)行結(jié)果:

D:\Java\jdk1.8.0_171\bin\java.exe "-javaagent:D:\JetBrains\IntelliJ IDEA counter1.index:4192522 counter2.index:5000000

值得注意的是,使用的時(shí)候注意如下幾點(diǎn):

  • 字段必須是volatile類型的,在線程之間共享變量時(shí)保證立即可見
  • 字段的描述類型(修飾符public/protected/default/private)是與調(diào)用者與操作對(duì)象字段的關(guān)系一致。也就是說調(diào)用者能夠直接操作對(duì)象字段,那么就可以反射進(jìn)行原子操作。
  • 對(duì)于父類的字段,子類是不能直接操作的,盡管子類可以訪問父類的字段。
  • 只能是實(shí)例變量,不能是類變量,也就是說不能加static關(guān)鍵字。
  • 只能是可修改變量,不能使final變量,因?yàn)閒inal的語義就是不可修改。
  • 對(duì)于AtomicIntegerFieldUpdater和AtomicLongFieldUpdater只能修改int/long類型的字段,不能修改其包裝類型(Integer/Long)。如果要修改包裝類型就需要使用AtomicReferenceFieldUpdater。
    參考:Java并發(fā)學(xué)習(xí)(九)-AtomicIntegerFieldUpdater字段原子更新類
  • AtomicIntegerArray的常用方法:

    //創(chuàng)建AtomicIntegerFieldUpdater對(duì)象,tclass為需要操作對(duì)象的類型,fieldName為需要操作字段名稱 static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName)//如果obj中指定字段的值等于expect,則把該字段的值設(shè)為update boolean compareAndSet(T obj, int expect, int update) //把obj中指定字段的值設(shè)置為newValue void set(T obj, int newValue);//返回obj中指定字段的值 int get(T obj);//把obj中指定字段的值設(shè)置為newValue,返回以前的值 int getAndSet(T obj, int newValue)//i++ int getAndIncrement(T obj)//++i int incrementAndGet(T obj)//i-- int getAndDecrement(T obj) //--i decrementAndGet(T obj)//把obj中指定字段的值加上delta,返回以前的值 int getAndAdd(T obj, int delta)//把obj中指定字段的值加上delta,返回更新后的值 int addAndGet(T obj, int delta)//1.8新增方法,更obj中指定字段的值,返回以前的值 int getAndUpdate(T obj, IntUnaryOperator updateFunction)//1.8新增方法,更obj中指定字段的值,返回更新后的值 int updateAndGet(T obj, IntUnaryOperator updateFunction)//1.8新增方法,更obj中指定字段的值,返回以前的值 int getAndAccumulate(T obj, int x, IntBinaryOperator accumulatorFunction)//1.8新增方法,更obj中指定字段的值,返回更新后的值 int accumulateAndGet(T obj, int x, IntBinaryOperator accumulatorFunction)

    轉(zhuǎn)載于:https://my.oschina.net/u/2424727/blog/1933993

    總結(jié)

    以上是生活随笔為你收集整理的AtomicIntegerArray和AtomicIntegerFieldUpdater的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。