好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java并发JUC工具包AtomicInteger原子整型语法基础

AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作。AtomicInteger 作为 java.util.concurrent.atomic 包的一部分,从Java 1.5开始引入。

1. AtomicInteger基础用法

通过下文的 AtomicInteger 构造方法,可以创建一个 AtomicInteger 对象,该对象的初始值默认为0。 AtomicInteger 提供get和set方法,获取底层int整数值,与设置int整数值

?

1

2

3

4

5

6

//初始值为0的atomicInteger对象

AtomicInteger atomicInteger = new AtomicInteger(); 

//初始值为200的atomicInteger对象

AtomicInteger atomicInteger = new AtomicInteger( 200 );

int currentValue = atomicInteger.get();         //100

atomicInteger.set( 2453 );                        //现在的值是 2453

但是上面的方法,对于 AtomicInteger 而言并不是它的核心内容, AtomicInteger 核心内容体现在它的原子性,我们下文介绍。

2. 什么时候需要使用AtomicInteger

我们通常在以下的两种场景下使用 AtomicInteger

多线程并发场景下操作一个计数器,需要保证计数器操作的原子性。

进行数值比较,如果给定值与当前值相等,进行数值的更新操作,并实现操作的非阻塞算法。

2.1. 原子计数器场景

把 AtomicInteger 作为一个计数器使用, AtomicInteger 提供了若干方法进行加法、减法的原子操作。

比如从一个map里面获取值,用get()方法,这是第一个操作;获取到值之后给这个值加上n,这是第二个操作;将进行过加法运算的值,再次放入map里面是第三个操作。所谓操作的原子性是指:在多线程并发的场景下,上面的三个操作是原子性的,也就是不可分割的。不会出现A线程get了数值,B线程同时也get到了该数值,两个线程同时为该值做运算并先后再次放入的情况,这种情况对于 AtomicInteger 而言是不会出现的, AtomicInteger 操作是线程安全的、不可分割的。

addAndGet() - 将给定的值加到当前值上,并在加法后返回新值,并保证操作的原子性。

getAndAdd() - 将给定的值加到当前值上,并返回旧值,并保证操作的原子性。

incrementAndGet() - 将当前值增加1,并在增加后返回新值。它相当于 ++i 操作,并保证操作的原子性。

getAndIncrement() - 将当前值增加1并返回旧值。相当于 ++i 操作,并保证操作的原子性。

decrementAndGet() - 将当前值减去1,并在减去后返回新值,相当于 i-- 操作,并保证操作的原子性。

getAndDecrement() - 将当前值减去1,并返回旧值。它相当于 --i 操作,并保证操作的原子性。

下面是AtomicInteger原子性操作方法的例子

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class Main {

     public static void main(String[] args) {

         //初始值为100的atomic Integer

         AtomicInteger atomicInteger = new AtomicInteger( 100 );

         System.out.println(atomicInteger.addAndGet( 2 ));         //加2并返回102

         System.out.println(atomicInteger);                      //102

         System.out.println(atomicInteger.getAndAdd( 2 ));         //先获取102,再加2

         System.out.println(atomicInteger);                      //104

         System.out.println(atomicInteger.incrementAndGet());    //加1再获取105  

         System.out.println(atomicInteger);                      //105  

         System.out.println(atomicInteger.getAndIncrement());    //先获取105再加1

         System.out.println(atomicInteger);                      //106

         System.out.println(atomicInteger.decrementAndGet());    //减1再获取105

         System.out.println(atomicInteger);                      //105

         System.out.println(atomicInteger.getAndDecrement());    //先获取105,再减1

         System.out.println(atomicInteger);                      //104

     }

}

2.2. 数值比对及交换操作

compareAndSet操作将一个内存位置的内容与一个给定的值进行比较,只有当它们相同时,才会将该内存位置的内容修改为一个给定的新值。这个过程是以单个原子操作的方式完成的。

compareAndSet方法:如果当前值==预期值,则将值设置为给定的更新值。

?

1

boolean compareAndSet( int expect, int update)

expect 是预期值

update 是更新值

AtomicInteger compareAndSet() 方法的例子

?

1

2

3

4

5

6

7

8

9

10

11

12

13

import java.util.concurrent.atomic.AtomicInteger;

public class Main {

     public static void main(String[] args) {

         //初始值为100的atomic Integer

         AtomicInteger atomicInteger = new AtomicInteger( 100 );

         //当前值100 = 预期值100,所以设置atomicInteger=110

         boolean isSuccess = atomicInteger测试数据pareAndSet( 100 , 110 ); 

         System.out.println(isSuccess);      //输出结果为true表示操作成功

         //当前值110 = 预期值100?不相等,所以atomicInteger仍然等于110

         isSuccess = atomicInteger测试数据pareAndSet( 100 , 120 ); 

         System.out.println(isSuccess);      //输出结果为false表示操作失败

     }

}

3. 总结

AtomicInteger 可以帮助我们在不使用synchronized同步锁的情况下,实现在多线程场景下int数值操作的线程安全,操作的原子性。并且使用 AtomicInteger 来实现int数值的原子操作,远比使用synchronized同步锁效率更高。

java.util.concurrent.atomic 包不仅为我们提供了 AtomicInteger ,还提供了AtomicBoolean布尔原子操作类、AtomicLong长整型布尔原子操作类、AtomicReference对象原子操作类、AtomicIntegerArray整型数组原子操作类、AtomicLongArray长整型数组原子操作类、AtomicReferenceArray对象数组原子操作类。

以上就是java并发JUC工具包AtomicInteger原子整型语法基础的详细内容,更多关于JUC AtomicInteger原子整型语法的资料请关注其它相关文章!

原文链接:https://zimug.blog.csdn.net/article/details/115500896

查看更多关于java并发JUC工具包AtomicInteger原子整型语法基础的详细内容...

  阅读:15次