文档章节

Java并发工具类——AtomicInteger

 东都大狼狗
发布于 08/19 17:11
字数 589
阅读 14
收藏 1

基本类型int的递增等操作并不是线程安全的,加上synchronized又会影响性能,因此在并发情况下我们应该使用AtomicInteger,下面通过一个例子验证一哈。

public class TestAtomicInteger {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new AtomicIntegerThread());
        executorService.execute(new AtomicIntegerThread());
        executorService.execute(new AtomicIntegerThread());
        executorService.execute(new AtomicIntegerThread());
        executorService.execute(new AtomicIntegerThread());
        executorService.execute(new IntegerThread());
        executorService.execute(new IntegerThread());
        executorService.execute(new IntegerThread());
        executorService.execute(new IntegerThread());
        executorService.execute(new IntegerThread());
        executorService.shutdown();
        boolean b = executorService.awaitTermination(5, TimeUnit.SECONDS);
        if(b) {
            System.out.println("AtomicIntegerThread:" + AtomicIntegerThread.ai.get());
            System.out.println("IntegerThread:" + IntegerThread.i);
        }else{
            System.out.println("time out.");
        }
    }
}

class AtomicIntegerThread implements Runnable {
    static AtomicInteger ai = new AtomicInteger(0);
    @Override
    public void run() {
        for (int m = 0; m < 10000000; m++) {
            ai.getAndIncrement();
        }
    }
}

class IntegerThread implements Runnable {
    static int i = 0;
    @Override
    public void run() {
        for (int m = 0; m < 10000000; m++) {
            i++;
        }
    }
}

运行结果如下:

AtomicIntegerThread:50000000
IntegerThread:26507929

AtomicInteger线程安全的运算是基于sun.misc.Unsafe类中的本地方法,关于Unsafe的介绍可以参考sun.misc.Unsafe

AtomicInteger的常用方法:

//获取当前值
int get();

//设置指定值
void set(int newValue)

//设置指定值并返回原来的值
int getAndSet(int newValue)

// i++
int getAndIncrement()

// ++i
int incrementAndGet()

// i--
int getAndDecrement()

// --i
int decrementAndGet()

//当前值加上delta,返回以前的值
int getAndAdd(int delta)

//当前值加上delta,返回新的值
int addAndGet(int delta)

//如果当前值等于入参expect,则把值设为update,并返回ture,如果不等则返回false
boolean compareAndSet(int expect, int update)
// 1.8新增方法,更新当前值,返回以前的值
int getAndUpdate(IntUnaryOperator updateFunction)

// 1.8新增方法,更新当前值,返回更新后的值
int updateAndGet(IntUnaryOperator updateFunction)

// 1.8新增方法,更新当前值,返回以前的值
int getAndAccumulate(int x,IntBinaryOperator accumulatorFunction)

// 1.8新增方法,更新当前值,返回更新后的值
int accumulateAndGet(int x,IntBinaryOperator accumulatorFunction)


/**
 * 演示AtomicInteger中1.8新增方法的使用方法
 */
@Test
public void operatorTest(){
    AtomicInteger i = new AtomicInteger(0);
    //lambda表达式中参数operand表示AtomicInteger的当前值
    int andUpdate = i.getAndUpdate(operand -> ++operand);
    System.out.println(andUpdate); //result: 0
    System.out.println(i.get()); //result: 1

    int i1 = i.updateAndGet(operand -> operand-2 );
    System.out.println(i1); //result: -1
    System.out.println(i.get()); //result: -1

    //lambda表达式中参数left表示AtomicInteger的当前值、right表示前面那个参数5
    int andAccumulate = i.getAndAccumulate(5, (left, right) -> left + right);
    System.out.println(andAccumulate); //result: -1
    System.out.println(i.get()); //result: 4

    int i2 = i.accumulateAndGet(4, (left, right) -> left + right);
    System.out.println(i2); //result: 8
    System.out.println(i.get()); //result: 8
}

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 11
码字总数 11097
作品 0
渝北
程序员
私信 提问
Java Concurrency(二)——J.U.C atomic包源码解读

java5之后的java.util.concurrent包是世界级并发大师Doug Lea的作品,里面主要实现了 atomic包里Integer/Long对应的原子类,主要基于CAS; 一些同步子,包括Lock,CountDownLatch,Semaphore...

谦谦君子
2015/01/06
0
2
java.util.concurrent.AtomicInteger

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加...

wlg910525
2014/07/14
0
0
无锁的同步策略——CAS操作详解

1. 从乐观锁和悲观锁谈起 乐观锁和悲观锁是两种不同的解决并发问题的策略。悲观锁策略假定任何一次并发都会发生冲突,所以总是采用最严格的方式来进行并发控制。java中的独占锁(synchronized...

takumiCX
07/14
0
0
Java 并发工具包 java.util.concurrent 用户指南

译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html。 本指南已做成中英文对照阅读版的 pdf 文档,有兴趣的朋友...

pior
2015/10/26
0
0
Java AtomicInteger的用法

1.java.util.concurrent.atomic 的包里有AtomicBoolean, AtomicInteger,AtomicLong,AtomicLongArray, AtomicReference等原子类的类,主要用于在高并发环境下的高效程序处理,来帮助我们简化同...

啊哈关关
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式

SpringBoot序列化和反序列化Json时默认使用的是Jackson(例如使用@RequestBody反序列化前端传递过来的Json字符串时), 当我们前端使用Json字符串传递到后台时日期格式可能是时间戳(即long类...

帅得拖网速
43分钟前
0
0
可自定义扩展底部列表对话框ListBottomSheetDialogFragment

因为需要,为了方便,构建了一个可以自定义扩展的底部列表对话框,可以应付大部分场景。 效果图如下: 1.默认实现: 2.自定义列表实现 3.自定义头部和列表实现 一.可实现功能 1.默认可实现通...

明月春秋
今天
1
0
数据库---增删改查

增:insert into 表名(列名1,列名2) values(‘列值1’,‘列值2’) 多行数据处理:insert into 表名(列名1,列名2) select ‘列值1’,‘列值2’ union select ‘列值1.1’,‘列值2.2...

森林之下
今天
2
0
分布式/集群下session共享方案汇总

除去那些对容器依赖特别高的方案(如: 基于Tomcat的memcached-session-manager / tomcat-redis-session-manager,基于Jetty的jetty-nosql-memcache / jetty-session-redis ),自己整理了下...

哥本哈根的小哥
今天
2
0
Vue中的缩写:v-bind、v-on

v-bind 缩写:: 预期:any (with argument) | Object (without argument) 参数:attrOrProp (optional) 修饰符: .prop - 被用于绑定 DOM 属性。 .camel - (2.1.0+) 将 kebab-case 特性名转换......

文文1
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部