AtomicReference 原子引用

时间:2020-01-09 10:36:24  来源:igfitidea点击:

" AtomicReference"类提供了一个对象引用变量,可以原子地对其进行读写。原子的意思是,多个线程尝试更改相同的" AtomicReference"(例如,通过比较和交换操作)不会使" AtomicReference"最终处于不一致状态。 " AtomicReference"甚至还具有高级的" compareAndSet()"方法,该方法可让我们将参考与期望值(参考)进行比较,如果它们相等,则在" AtomicReference"对象内设置一个新参考。

创建一个原子引用

我们可以这样创建AtomicReference实例:

AtomicReference atomicReference = new AtomicReference();

如果我们需要使用初始参考来创建AtomicReference,则可以这样进行:

String initialReference = "the initially referenced string";
AtomicReference atomicReference = new AtomicReference(initialReference);

创建一个类型化的AtomicReference

我们可以使用Java泛型来创建类型化的AtomicReference。这是一个有类型的" AtomicReference"示例:

AtomicReference<String> atomicStringReference =
    new AtomicReference<String>();

我们也可以为输入的" AtomicReference"设置初始值。这是一个带有初始值的有类型的AtomicReference实例化示例:

String initialReference = "the initially referenced string";
AtomicReference<String> atomicStringReference =
    new AtomicReference<String>(initialReference);

获取AtomicReference参考

我们可以使用AtomicReference的get()方法获取存储在AtomicReference中的引用。如果我们有未类型化的" AtomicReference",则" get()"方法将返回"对象"引用。如果我们输入的是AtomicReference,则get()返回对创建时在AtomicReference变量上声明的类型的引用。

这首先是一个无类型的AtomicReference``get()示例:

AtomicReference atomicReference = new AtomicReference("first value referenced");

String reference = (String) atomicReference.get();

注意,必须将get()返回的引用强制转换为String,因为在未键入AtomicReference的情况下get()返回对象引用。

这是一个有类型的" AtomicReference"示例:

AtomicReference<String> atomicReference = 
     new AtomicReference<String>("first value referenced");

String reference = atomicReference.get();

注意,不再需要强制转换get()返回的引用,因为编译器知道它将返回一个String引用。

设置AtomicReference参考

我们可以使用set()方法设置存储在AtomicReference实例中的引用。在无类型的AtomicReference实例中,set()方法将Object引用作为参数。在类型为AtomicReference的类型中,set()方法采用任何类型的参数作为我们在声明AtomicReference时声明的类型。

这是一个AtomicReference`set()示例:

AtomicReference atomicReference = 
     new AtomicReference();
    
atomicReference.set("New object referenced");

对于非类型化或者类型化引用,使用set()方法没有什么区别。我们将遇到的唯一真正的区别是,编译器将限制我们可以在类型为AtomicReference的类型上设置的类型。

比较和设置AtomicReference参考

" AtomicReference"类包含一个名为" compareAndSet()"的有用方法。 compareAndSet()方法可以将存储在AtomicReference实例中的引用与期望的引用进行比较,如果两个引用相同(与equals()不同但与在==中相同) ,则可以在AtomicReference实例上设置一个新引用。

如果compareAndSet()在AtomicReference中设置了新的引用,则compareAndSet()方法将返回true。否则,compareAndSet()返回false。

这是一个AtomicReference``compareAndSet()示例:

String initialReference = "initial value referenced";

AtomicReference<String> atomicStringReference =
    new AtomicReference<String>(initialReference);

String newReference = "new value referenced";
boolean exchanged = atomicStringReference.compareAndSet(initialReference, newReference);
System.out.println("exchanged: " + exchanged);

exchanged = atomicStringReference.compareAndSet(initialReference, newReference);
System.out.println("exchanged: " + exchanged);

本示例创建一个带有初始引用的类型化的" AtomicReference"。然后,它两次调用comparesAndSet(),以将存储的参考与初始参考进行比较,如果存储的参考与初始参考相等,则设置一个新的参考。这两个引用第一次相同,因此在" AtomicReference"上设置了一个新引用。第二次存储的引用是之前在对compareAndSet()的调用中设置的新引用,因此存储的引用当然不等于初始引用。因此,没有在AtomicReference上设置新的引用,并且compareAndSet()方法返回false。