📅  最后修改于: 2023-12-03 15:31:49.887000             🧑  作者: Mango
在多线程编程中,经常会涉及到操作共享变量的问题。在Java中,使用 AtomicInteger
类可以保证对变量的操作是原子性的,即每个线程的操作都是相互独立的,不会相互干扰。AtomicInteger
类中有一个 getAndSet()
方法,可以获取并设置变量的值。
AtomicInteger
类是Java并发包中的一个类,用于提供对整数变量的原子性操作。该类的常用方法包括:
get()
:获取当前变量的值;addAndGet(int delta)
:以原子方式将给定值与当前值相加,并返回相加后的值;getAndIncrement()
:以原子方式将当前值加 1,并返回加 1 前的值;getAndSet(int newValue)
:以原子方式设置为给定值,并返回旧值。getAndSet()
方法可以获取并设置变量的值。该方法的语法如下:
public final int getAndSet(int newValue)
其中,newValue
表示将要设置的新值,该值必须是整型。
getAndSet()
方法的返回值为变量在设置前的旧值。
下面是一个使用 AtomicInteger
类的示例,展示了 getAndSet()
方法的使用:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerDemo {
public static void main(String[] args) {
AtomicInteger count = new AtomicInteger(0); // 创建一个初始值为0的原子整数变量
for (int i = 0; i < 10; i++) {
new Thread(() -> {
int oldValue = count.getAndSet(1); // 获取并设置变量的值
System.out.println("线程" + Thread.currentThread().getName() + "修改前的值为:" + oldValue);
System.out.println("线程" + Thread.currentThread().getName() + "修改后的值为:" + count.get());
}, "线程" + i).start();
}
}
}
在这个示例中,我们首先创建了一个初始值为 0 的 AtomicInteger
类型的变量 count
。然后开启了 10 个线程,每个线程执行 getAndSet(1)
方法,该方法会将变量的旧值设置为 1,并返回旧值。每个线程都会输出变量的旧值和新值。
示例的输出结果如下:
线程线程0修改前的值为:0
线程线程1修改前的值为:0
线程线程3修改前的值为:0
线程线程2修改前的值为:0
线程线程5修改前的值为:0
线程线程9修改前的值为:0
线程线程8修改前的值为:0
线程线程7修改前的值为:0
线程线程6修改前的值为:0
线程线程4修改前的值为:0
线程线程1修改后的值为:1
线程线程2修改后的值为:1
线程线程0修改后的值为:1
线程线程3修改后的值为:1
线程线程4修改后的值为:1
线程线程6修改后的值为:1
线程线程8修改后的值为:1
线程线程5修改后的值为:1
线程线程7修改后的值为:1
线程线程9修改后的值为:1
从输出结果可以看到,每次修改变量的值,getAndSet()
方法会返回变量的旧值。并且,该示例的输出结果也证明了 AtomicInteger
的原子性操作。无论开启了多少个线程,最后输出的变量值都为 1。