前言

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仍然为“李四”
posted on 2020-09-17 10:52  风停了,雨来了  阅读(17827)  评论(0编辑  收藏  举报