13个类的分类:
- 原子更新基本类型:boolean、int、long
- 原子更新数组:
- 原子更新引用:
- 原子更新属性:
原子更新基本类型
getAndIncrement实现原理
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
步骤描述:
- 获取当前值
- 执行加1操作
- CAS更新,若失败,重复这3步操作
原子更新数组类型
目前有:AtomicReferenceArray、AtomicIntegerArray、AtomicLongArray三个类
然后就是原子设置某个index下 的值。书中未解释原因
原子更新引用类型
AtomicReference
User gaoxi = new User("gaoxi", 23);
AtomicReference<User> userAtomicReference = new AtomicReference<>();
userAtomicReference.set(gaoxi);
User james = new User("James", 37);
userAtomicReference.compareAndSet(gaoxi,james);
System.out.println(userAtomicReference.get().name);
AtomicReferenceFieldUpdater:更新对象里的一个引用类型
- 必须是public volatile修饰
AtomicReferenceFieldUpdater<User, String> name = AtomicReferenceFieldUpdater.newUpdater(User.class, String.class, "name");
- 必须是public volatile修饰
AtomicMarkableReference:这个里包含一个引用和一个boolean标记位字段。可以原子更新两者
原子更新字段类
AtomicIntegerFieldUpdater
- 对象的属性必须是public修饰
- 对象熟悉应该是基本类型 int
- AtomicLongFieldUpdater
- AtomicStampedReference