乐趣区

关于原子性:Java类AtomicReference详解

前言

Atomic 家族次要是保障多线程环境下的原子性,相比 synchronized 而言更加轻量级。比拟罕用的是 AtomicInteger,作用是对 Integer 类型操作的封装,而 AtomicReference 作用是对一般对象的封装。

对 AtomicInteger 原子性不理解的,能够看这篇:volatile 详解

先看个例子

// 先简略定义个 User 类

@Data
@AllArgsConstructor
public class User {
    private String name;
    private Integer age;
}
// 应用 AtomicReference 初始化,并赋值

public static void main(String[] args ) {User user1 = new User("张三", 23);
    User user2 = new User("李四", 25);
    User user3 = new User("王五", 20);

    // 初始化为 user1
    AtomicReference<User> atomicReference = new AtomicReference<>();
    atomicReference.set(user1);

    // 把 user2 赋给 atomicReference
    atomicReference.compareAndSet(user1, user2);
    System.out.println(atomicReference.get());

    // 把 user3 赋给 atomicReference
    atomicReference.compareAndSet(user1, user3);
    System.out.println(atomicReference.get());
}

输入后果如下:

User(name= 李四, age=25)
User(name= 李四, age=25)

解释

compareAndSet(V expect, V update)
该办法作用是:如果 atomicReference==expect,就把 update 赋给 atomicReference,否则不做任何解决。

  • atomicReference的初始值是 user1,所以调用compareAndSet(user1, user2),因为user1==user1,所以会把user2 赋给atomicReference。此时值为“李四”
  • 第二次调用 atomicReference.compareAndSet(user1, user3),因为 user2 != user1,所以set 失败。atomicReference依然为“李四”

援用:https://www.cnblogs.com/fhbli…

退出移动版