- 原子更新基本类型
AtomicBoolean
AtomicInteger
AtomicLong
- 原子更新数组
AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
- 原子更新引用类型
AtomicReference
AtomicReferenceFieldUpdater
:原子更新引用类型里的字段AtomicMarkableReference
:原子更新带有标记位的引用类型
- 原子更新字段类
AtomicIntegerFieldUpdater
:原子更新 Integer 字段的更新器AtomicLongFieldUpdater
:原子更新长 Long 字段的更新器AtomicStampedReference
:原子更新带版本号的引用类型。即将整数的版本号值与引用关联起来,每一次更新都会改变版本号值,可以用来解决 CAS 中的 ABA 问题
// 原子方式将数值加delta,并返回
public final int addAndGet(int delta)
// 如果oldValue == expect,将它更新为update
public final boolean compareAndSet(int expect, int update)
// 类似i++操作,返回的是旧值
public final int getAndIncrement()
// 最终会设置为newValue,使用lazySet设置后,可能在之后的一段中,其他线程读到的还是旧值
public final void lazySet(int newValue)
// 原子方式设置新值,并返回旧值
public final int getAndSet(int newValue)
使用方法:
public class AtomicIntegerDemo {
static AtomicInteger ai = new AtomicInteger(1);
public static void main(String[] args) {
System.out.println(ai.getAndIncrement());
System.out.println(ai.get());
}
}
// 对数组索引为i的元素进行addAndGet(int delta)操作
public final int addAndGet(int i, int delta)
// 对数组索引为i的元素进行compareAndSet(int expect, int update)操作
public final boolean compareAndSet(int i, int expect, int update)
使用方法:
public class AtomicIntegerArrayDemo {
static int[] value = new int[] {1, 2};
static AtomicIntegerArray ai = new AtomicIntegerArray(value);
public static void main(String[] args) {
ai.getAndSet(0, 3)
System.out.println(ai.get(0));
System.out.println(value[0]);
}
}
public class AtomicReferenceDemo {
public static AtomicReference<User> ar =
new AtomicReference<User>();
public static void main(String[] args) {
User user = new User("user", 15);
ar.set(user);
System.out.println(ar.get().name);
System.out.println(ar.get().old);
}
public static class User {
public String name;
public int old;
public User(String name, int old) {
this.name = name;
this.old = old;
}
}
}
想要原子的更新字段需要两步:
public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName)
得到更新器实例,设置想要进行原子更新的类和具体的属性- 更新类的字段必须使用
public volatile
修饰
示例:
public class AtomicIntegerFieldUpdaterDemo {
private static AtomicIntegerFieldUpdater<User> updater =
AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
public static void main(String[] args) {
User user = new User("user", 10);
System.out.println(updater.getAndIncrement(user));
System.out.println(user.old);
}
public static class User {
public String name;
public volatile int old;
public User(String name, int old) {
this.name = name;
this.old = old;
}
}
}