13个类的分类:

  • 原子更新基本类型:boolean、int、long
  • 原子更新数组:
  • 原子更新引用:
  • 原子更新属性:

原子更新基本类型

目前只有boolean、int和long三个类

getAndIncrement实现原理

  1. public final int getAndIncrement() {
  2. for (;;) {
  3. int current = get();
  4. int next = current + 1;
  5. if (compareAndSet(current, next))
  6. return current;
  7. }
  8. }
  1. 步骤描述:
  • 获取当前值
  • 执行加1操作
  • CAS更新,若失败,重复这3步操作

    原子更新数组类型

    目前有:AtomicReferenceArray、AtomicIntegerArray、AtomicLongArray三个类
    然后就是原子设置某个index下 的值。书中未解释原因

原子更新引用类型

  • AtomicReference

    1. User gaoxi = new User("gaoxi", 23);
    2. AtomicReference<User> userAtomicReference = new AtomicReference<>();
    3. userAtomicReference.set(gaoxi);
    4. User james = new User("James", 37);
    5. userAtomicReference.compareAndSet(gaoxi,james);
    6. System.out.println(userAtomicReference.get().name);
  • AtomicReferenceFieldUpdater:更新对象里的一个引用类型

    • 必须是public volatile修饰
      1. AtomicReferenceFieldUpdater<User, String> name = AtomicReferenceFieldUpdater.newUpdater(User.class, String.class, "name");
  • AtomicMarkableReference:这个里包含一个引用和一个boolean标记位字段。可以原子更新两者

    原子更新字段类

  • AtomicIntegerFieldUpdater

    • 对象的属性必须是public修饰
    • 对象熟悉应该是基本类型 int
  • AtomicLongFieldUpdater
  • AtomicStampedReference