本文翻译自http://tutorials.jenkov.com/java-util-concurrent/atomicinteger.html,人工翻译,仅供学习交流。
AtomicInteger
AtomicInteger类提供了一个int变量,可以以原子方式读写,也包含像compareAndSet()这样的高级原子操作。AtomicInteger类位于java.util.concurrent.atomic包中,所以完整的类名是java.util.concurrent.atomic.AtomicInteger。本文描述了在Java 8中找到的AtomicInteger版本,但第一个版本是在Java 5中添加的。AtomicInteger设计背后的原因在我的Java并发教程中比较和交换的文中解释过。
创建AtomicInteger
创建AtomicInteger是这样的:
AtomicInteger atomicInteger = new AtomicInteger();
这个例子创建了一个初始值为0的AtomicInteger。如果你想创建一个带有初始值的AtomicInteger,你可以这样做:
AtomicInteger atomicInteger = new AtomicInteger(123);
这个例子将值123作为参数传递给AtomicInteger构造函数,它将AtomicInteger实例的初始值设置为123。
获取AtomicInteger值
可以通过set()方法设置AtomicInteger实例的值。下面是AtomicInteger.set()的例子:
AtomicInteger atomicInteger = new AtomicInteger(123);
atomicInteger.set(234);
本例创建了一个AtomicInteger示例,初始值为123,然后在下一行将其值设为234。
比较和设置AtomicInteger值
AtomicInteger类也有一个原子的compareAndSet()方法。该方法将AtomicInteger实例的当前值与期望值进行比较,如果两个值相等,则为AtomicInteger实例设置一个新值。下面是AtomicInteger.compareAndSet()的例子:
AtomicInteger atomicInteger = new AtomicInteger(123);
int expectedValue = 123;
int newValue = 234;
atomicInteger.compareAndSet(expectedValue, newValue);
这个例子首先创建了一个AtomicInteger实例,初始值为123。然后将AtomicInteger的值与期望值123进行比较,如果它们相等,则AtomicInteger的新值变为234;
添加到AtomicInteger值
AtomicInteger类包含一些可用于向AtomicInteger添加值并返回它的值的方法,方法如下:
- addAndGet()
- getAndAdd()
- getAndIncrement()
- incrementAndGet()
addAndGet()向AtomicInteger添加一个数字,并在添加后返回它的值。getAndAdd()也向AtomicInteger添加一个数字,但返回AtomicInteger之前的值。使用这两种方法中的哪一种取决于实际用法。这里有两个例子:
AtomicInteger atomicInteger = new AtomicInteger();
System.out.println(atomicInteger.getAndAdd(10));
System.out.println(atomicInteger.addAndGet(10));
本例将输出值0和20。首先,在将10添加到之前,该示例获取AtomicInteger的值。它在加法之前的值为0。然后,该示例将10添加到AtomicInteger,并在添加之后获取值。现在的值是20。
您还可以通过这两个方法向AtomicInteger添加负数。结果实际上是一个减法。
方法getAndIncrement()和incrementAndGet()的工作原理类似于getAndAdd()和addAndGet(),只是在AtomicInteger的值上加1。
从AtomicInteger值中减去
AtomicInteger类也包含一些从AtomicInteger值中自动减去值的方法。方法如下
- decrementAndGet()
- getAndDecrement()
decrementAndGet()从AtomicInteger值中减去1,并在减去之后返回它的值。getAndDecrement()也从AtomicInteger值中减去1,但返回AtomicInteger在减法之前的值。