📅  最后修改于: 2023-12-03 15:31:50.032000             🧑  作者: Mango
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
。