📌  相关文章
📜  Java中的 AtomicInteger getAndSet() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:31:49.887000             🧑  作者: Mango

Java中的 AtomicInteger getAndSet() 方法及示例

在多线程编程中,经常会涉及到操作共享变量的问题。在Java中,使用 AtomicInteger 类可以保证对变量的操作是原子性的,即每个线程的操作都是相互独立的,不会相互干扰。AtomicInteger 类中有一个 getAndSet() 方法,可以获取并设置变量的值。

AtomicInteger 类

AtomicInteger 类是Java并发包中的一个类,用于提供对整数变量的原子性操作。该类的常用方法包括:

  • get():获取当前变量的值;
  • addAndGet(int delta):以原子方式将给定值与当前值相加,并返回相加后的值;
  • getAndIncrement():以原子方式将当前值加 1,并返回加 1 前的值;
  • getAndSet(int newValue):以原子方式设置为给定值,并返回旧值。
getAndSet() 方法

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。