前言
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...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。