一、AtomicReference介绍
-
AtomicReference
和AtomicInteger
非常类似,不同之处就在于AtomicInteger
是对整数的封装,而AtomicReference
则对应普通的对象引用。也就是它可以保证你在修改对象引用时的线程安全性
。
-
AtomicReference
是作用是对”对象”进行原子操作。 提供了一种读和写都是原子性的对象引用变量。原子意味着多个线程试图改变同一个AtomicReference
(例如比较和交换操作)将不会使得AtomicReference
处于不一致的状态。
二、示例
public class AtomicReferenceTest {
public static void main(String[] args) {
test4();
}
private static void test1() {
AtomicReference<People> atomicReference = new AtomicReference<>();
atomicReference.set(new People("张三", 18));
People people = atomicReference.get();
System.out.println(people);
}
private static void test2() {
AtomicReference<People> atomicReference = new AtomicReference<>(new People("张三", 18));
People people = atomicReference.get();
System.out.println(people);
}
private static void test3() {
People origin = new People("张三", 18);
AtomicReference<People> atomicReference = new AtomicReference<>(origin);
People another = new People("李四", 20);
boolean result = atomicReference.compareAndSet(origin, another);
People now = atomicReference.get();
System.out.println(String.format("set result:%s \nnow:%s", result, now));
}
private static void test4() {
People origin = new People("张三", 18);
AtomicReference<People> atomicReference = new AtomicReference<>(origin);
People another = new People("李四", 20);
People get = atomicReference.getAndSet(another);
People now = atomicReference.get();
System.out.println(String.format("get result:%s \nnow:%s", get, now));
}
static class People {
private String name;
private Integer age;
public People(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}