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

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

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

介绍

Java中的AtomicReference类提供了一种线程安全的方式来管理对象引用。getAndSet()方法是其中的一种方法,它可以用于获取当前引用并设置新的引用。

该方法是原子的,即当多个线程尝试同时调用该方法时,只有一个线程可以成功地获取和设置引用。这是因为该方法使用了CAS(Compare and Swap)操作,通过比较当前值和期望值来判断是否需要进行替换。

语法

getAndSet()方法的语法如下:

public final V getAndSet(V newValue)

该方法需要传递一个新的引用作为参数,并返回先前的引用。

示例

以下示例演示了如何使用getAndSet()方法。在该示例中,我们创建了一个普通的String对象,并将其设置为AtomicReference的初始值。然后我们启动了两个线程,每个线程尝试同时更新AtomicReference的值。由于我们使用了getAndSet()方法,只有一个线程能够成功地更新引用。

import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        String initialValue = "Hello";
        AtomicReference<String> atomicReference = new AtomicReference<>(initialValue);

        Thread thread1 = new Thread(() -> {
            String newValue = "World";
            String oldValue = atomicReference.getAndSet(newValue);
            System.out.println("Thread1: Old value = " + oldValue + ", new value = " + newValue);
        });

        Thread thread2 = new Thread(() -> {
            String newValue = "Java";
            String oldValue = atomicReference.getAndSet(newValue);
            System.out.println("Thread2: Old value = " + oldValue + ", new value = " + newValue);
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println("Final value = " + atomicReference.get());
    }
}

输出结果为:

Thread1: Old value = Hello, new value = World
Thread2: Old value = World, new value = Java
Final value = Java

可以看到,当线程1先启动时,它更新了AtomicReference的值,然后线程2试图更新该值,但得到的是最新的引用。最后,AtomicReference对象的最终值为线程2设置的值Java