前言
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仍然為“李四”