AtomicIntegerArray和AtomicIntegerFieldUpdater
生活随笔
收集整理的這篇文章主要介紹了
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)證演示代碼:
運(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):
參考: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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业信息管理系统汇总
- 下一篇: Hadoop系列(三)MapReduce