天天看点

JAVA并发-AtomicInteger

AtomicInteger

类提供了int类型的变量,变量可以原子写和读,同时还包括先进的原子操作例如

compareAndSet()

。 

AtomicInteger

类位于java.util.concurrent.atomic

 包中,全名

java.util.concurrent.atomic. AtomicInteger

 。本文讲述JAVA8中的

AtomicInteger

 ,但是第一个版本是在Java 5中。

关于

AtomicInteger

设计原理可以参考

 Compare and Swap。

创建AtomicInteger

如下代码创建AtomicInteger:

AtomicInteger atomicInteger = new AtomicInteger();
           

上述例子创建了初始值为0的

AtomicInteger

  ,如果需要创建指定值的

AtomicInteger

  ,则代码如下:

AtomicInteger atomicInteger = new AtomicInteger(123);
           

例子中用123作为

AtomicInteger

 构造函数的参数,意思就是

AtomicInteger

  实例的初始值为123。

获取AtomicInteger 的值

可以通过 

AtomicInteger

get()

 方法获取值,下面是代码 

AtomicInteger.get()

:

AtomicInteger atomicInteger = new AtomicInteger(123);

int theValue = atomicInteger.get();
           

设置AtomicInteger的值

可以通过 

AtomicInteger

 的

set()

方法设置值,下面是

AtomicInteger.set()

的例子

AtomicInteger atomicInteger = new AtomicInteger(123);

atomicInteger.set(234);
           

例子中创建了一个初始值为123的 

AtomicInteger

,然后设置为234.

比较设置(CAS)的AtomicInteger值

AtomicInteger

类同样有原子的compareAndSet()方法,首先与AtomicInteger

 实例值得当前比较,如果相对这设置

AtomicInteger

 的新值,下面

AtomicInteger.compareAndSet()

代码:

AtomicInteger atomicInteger = new AtomicInteger(123);

int expectedValue = 123;
int newValue      = 234;
atomicInteger.compareAndSet(expectedValue, newValue);
           

首先创建初始值为123的 

AtomicInteger

实例,然后当前值与期望值123比较,如果相对则设置值为234.

增加AtomicInteger的值

AtomicInteger

类包含了一些增加和获取返回值的方法:

  • addAndGet()

  • getAndAdd()

  • getAndIncrement()

  • incrementAndGet()

第一个方法 

addAndGet()

 ,增加

AtomicInteger

  的值同时返回增加后的值,第二个方法 

getAndAdd()

增加值,但是返回增加之前的值,两个方法的差别看下面代码:

A
           
tomicInteger atomicInteger = new AtomicInteger();


System.out.println(atomicInteger.getAndAdd(10));
System.out.println(atomicInteger.addAndGet(10));
           

代码例子将大于0和20,首先获取

AtomicInteger

  增加10之前的值是0,然后再增加值并获取当前值是 

20

.同样可以通过两个方法增加负值,相当于做减法,g

etAndIncrement()

incrementAndGet()

 与 

getAndAdd()

addAndGet()

的工作原理相似,只不是加1

.

AtomicInteger 减法

AtomicInteger

类同样可以原子性的做减法,面是方法:

  • decrementAndGet()

  • getAndDecrement()

decrementAndGet()

方法减1并返回减后的值,getAndDecrement()同样减1并返回减之前的值

参考:http://tutorials.jenkov.com/java-util-concurrent/atomicinteger.html