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