-
基本类型
- AtomicInteger
static AtomicInteger atomicInteger = new AtomicInteger(1);
public static void main(String[] args) {
// 输出原值并且+1 ------1
System.out.println(atomicInteger.getAndIncrement());
// 输出原值并且+2 ------2
System.out.println(atomicInteger.getAndAdd(2));
// 输出结果 -----4
System.out.println(atomicInteger.get());
}
- AtomicBoolean
- AtomicLong
-
数组类
- AtomicIntegerArray
public static void main(String[] args) {
int[] arry = {1, 2, 3};
AtomicIntegerArray integerArray = new AtomicIntegerArray(arry);
// 第一个参数是数组下标,第二个参数是原值,第三个参数是新值
integerArray.compareAndSet(0, 1, 4);
// 可以看到原数组没有变化
Arrays.stream(arry).forEach(System.out::println);
// 变化的是integerArray, 输出4
System.out.println(integerArray.get(0));
}
- AtomicLongArray
- AtomicReferenceArray
-
引用类
- AtomicReference
static AtomicReference<User> atomicReference = new AtomicReference<>();
public static void main(String[] args) {
User user = new User("张三");
atomicReference.set(user);
User user2 = new User("李四");
atomicReference.compareAndSet(user, user2);
// 李四
System.out.println(atomicReference.get().getName());
// 张三
System.out.println(user.getName());
}
- AtomicMarkableReference
- AtomicStampedReference
带有版本号的原子类
public static void main(String[] args) {
// 第一个参数是值,第二个参数是版本号
AtomicStampedReference<String> stampedReference =
new AtomicStampedReference<>("123", 0);
System.out.println("版本:" + stampedReference.getStamp() +
"值:" + stampedReference.getReference());
// 第一个参数是原值,第二个是新值,第三个是原版本,第四个是新版本
// 由于原值、版本都相匹配,所以可以修改成功,返回true
boolean b = stampedReference.compareAndSet("123", "234", 0, 1);
System.out.println("版本:" + stampedReference.getStamp() +
"值:" + stampedReference.getReference());
// 第二次的话由于不匹配,所以修改失败,返回false
boolean b1 = stampedReference.compareAndSet("1234", "456", 0, 2);
System.out.println("版本:" + stampedReference.getStamp() +
"值:" + stampedReference.getReference());
}
-
原子更新字段类