二十多岁的年纪,是一个夹杂着为生活奔忙,疲惫,痛苦和快乐,抑郁,容易想太多,焦虑自己人生能不能成功、混出头的年龄段。
要相信明天会更好!
Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。
在Atomic包里一共提供了4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。
AtomicBoolean:原子更新布尔类型,源码实现:先把Boolean转换成整型,再使用compareAndSwapInt进行CAS
AtomicInteger:原子更新整型
AtomicLong:原子更新长整型
//1.原子更新基本类型类
static AtomicInteger atomic1 = new AtomicInteger(1);
public static void atomicInteger() {
//以原子方式将当前值加1,这里返回的是自增前的值
System.out.println(atomic1.getAndIncrement());
System.out.println(atomic1.get());
}
结果
1
2
Process finished with exit code 0
AtomicIntegerArray:原子更新整型数组里的元素
AtomicLongArray:原子更新长整型数组里的元素
AtomicReferenceArray:原子更新引用类型数组里的元素
//2.原子更新数组
static int[] value = new int[] {1, 2};
static AtomicIntegerArray atomic2 = new AtomicIntegerArray(value);//拷贝一份当前数组
public static void atomicIntegerArray() {
atomic2.getAndSet(0,3);//修改拷贝的数组索引值为0的元素
System.out.println(atomic2.get(0));
System.out.println(value[0]);
}
结果
3
1
Process finished with exit code 0
AtomicReference:原子更新引用类型
AtomicReferenceFiledUpdater:原子更新引用类型里的字段
AtomicMarkableReference:原子更新带有标记位的引用类型
//3.原子更新引用类型
static AtomicReference atomicUserRef = new AtomicReference();
public static void atomicReference() {
User user = new User("shuPush",18);
atomicUserRef.set(user);
User updateUser = new User("slx", 25);
//compareAndSet方法原理与atomicInteger里的一样,与期望值相同,则修改
atomicUserRef.compareAndSet(user, updateUser);
System.out.println(atomicUserRef.get().getName());
System.out.println(atomicUserRef.get().getOld());
}
public static class User {
private String name;
private int old;
public User(String name, int old) {
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public int getOld() {
return old;
}
}
结果
slx
25
Process finished with exit code 0
AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
AtomicLongFieldUpdater:原子更新长整型字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型
//创建原子更新器,并设置需要更新的对象类和对象的属性
private static AtomicIntegerFieldUpdater atomic4 = AtomicIntegerFieldUpdater.newUpdater(User.class,"old");
public static void main(String[] args) {
User user = new User("shuPush", 18);
//shuPush长了一岁,但是仍然会输出旧的年龄
System.out.println(atomic4.getAndIncrement(user));
//输出shuPush现在的年龄
System.out.println(atomic4.get(user));
}
public static class User {
private String name;
public volatile int old;
public User(String name, int old) {
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public int getOld() {
return old;
}
}
结果
18
19
Process finished with exit code 0