文档章节

Java并发工具类——AtomicInteger

 东都大狼狗
发布于 08/19 17:11
字数 589
阅读 9
收藏 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
博文 10
码字总数 7935
作品 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
Java AtomicInteger的用法

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

啊哈关关
2017/10/23
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

没有更多内容

加载失败,请刷新页面

加载更多

Sql语言与MySql数据库

1. 数据库简介 1. 数据库,就是存储数据的仓库,只能通过sql语言来访问,数据库也是一个文件系统。通常,MySQL、Oracle等数据库,也被称为关系型数据库,其保存的不仅仅只是数据,还包括数据...

江左煤郎
8分钟前
0
0
IDEA 取消自动import .*

打开设置 > Editor > Code Style > Java > Scheme Default > Imports ① 将 Class count to use import with "*" 改为 99 (导入同一个包的类超过这个数值自动变为 * ) ② 将 Names count ......

乔老哥
9分钟前
0
0
PostGIS学习笔记(开篇)

PostGIS事实上算是笔者开始写博客的第一篇内容。而事实上那篇博文的内容并不丰富,笔者对PostGIS的了解仍然不多,然而17年在OSGeo课程学习时对PostGIS又有了进一步了解,并逐步发现它的强大。...

胖胖雕
9分钟前
0
0
【Centos】在nginx服务器中配置php和mysql

接上一章《【Centos】利用Vultr服务器和namesilo布网》(https://my.oschina.net/u/3776619/blog/2051986),在Centos中配置好nginx,并在iptables中开启了80端口,和为了远程mysql操作方便开...

yongh701
33分钟前
1
0
flume -- fileChannel简要分析其过程

flume之event写入FileChannel doPut(event)-->获取共享锁后[log.lockShared();]-->FlumeEventPointer ptr = log.put(transactionID, event); 此处的log.put即将transactionID及event进行后续......

-九天-
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部