AtomicInteger 原子整数

时间:2020-01-09 10:36:24  来源:igfitidea点击:

AtomicInteger类为我们提供了一个int变量,该变量可以原子方式读取和写入,并且还包含高级原子操作,如compareAndSet()。 " AtomicInteger"类位于" java.util.concurrent.atomic"包中,因此完整的类名为" java.util.concurrent.atomic.AtomicInteger"。这段文字描述了Java 8中的" AtomicInteger"版本,但第一个版本是在Java 5中添加的。

我的Java并发性教程中有关"比较和交换"的文本中解释了AtomicInteger设计背后的原因。

创建一个AtomicInteger

创建一个" AtomicInteger"是这样完成的:

AtomicInteger atomicInteger = new AtomicInteger();

本示例创建一个初始值为0的AtomicInteger。

如果要创建具有初始值的AtomicInteger,可以这样进行:

AtomicInteger atomicInteger = new AtomicInteger(123);

此示例将值123作为参数传递给AtomicInteger构造函数,该构造函数将AtomicInteger实例的初始值设置为123.

获取AtomicInteger值

我们可以通过get()方法获取AtomicInteger实例的值。这是一个" AtomicInteger.get()"示例:

AtomicInteger atomicInteger = new AtomicInteger(123);

int theValue = atomicInteger.get();

设置AtomicInteger值

我们可以通过set()方法设置一个AtomicInteger实例的值。这是一个" AtomicInteger.set()"示例:

AtomicInteger atomicInteger = new AtomicInteger(123);

atomicInteger.set(234);

本示例创建一个初始值为123的" AtomicInteger"示例,然后在下一行将其值设置为" 234"。

比较并设置AtomicInteger值

AtomicInteger类还具有原子的compareAndSet()方法。该方法将" AtomicInteger"实例的当前值与期望值进行比较,如果两个值相等,则为" AtomicInteger"实例设置一个新值。这是一个AtomicInteger.compareAndSet()示例:

AtomicInteger atomicInteger = new AtomicInteger(123);

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

此示例首先创建一个初始值为123AtomicInteger实例。然后,它将" 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的值。