java.util.concurrent.atomic包,4种原子更新方式:原子更新基本数据,原子更新数组,原子更新引用,原子更新属性。
原子更新基本类型
包含3个类:AtomicBoolean,AtomicInteger,AtomicLong
以AtomicInteger
为例,常用方法有:
- int addAndGet(int delta) 以原子方式相加并返回结果
- boolean compareAndSet(int expect,int update)如果输入的数值等于预期值,则以原子方式将该值设置为输入的值
- int getAndIncrement()以原子方式将当前值加1,返回自增前的值
- void lazySet(int newValue)将值设置为newValue,但是需要一些时间。
- int getAndSet(int newValue)以原子方式设置为newValue,返回旧值
AtomicInteger a = new AtomicInteger(5);
System.out.println(a.getAndIncrement()); //输出5 值为6
System.out.println(a.getAndIncrement()); //输出6 值为7
System.out.println(a.compareAndSet(7, 9)); //此时值为7,所以值会变更为9并返回true。否则返回false,值不变。
原子更新数组
包含4个类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray,AtomicIntegerArray,AtomicDoubleArray
常用方法:
- int addAndGet(int i,int delta)以原子方式将索引为i的和delta相加。
- boolean compareAndSet(int i,int expect,int update)获取索引i的值compareAndSet
int[] b = new int[]{1, 2};
AtomicIntegerArray array = new AtomicIntegerArray(b);
System.out.println(array.addAndGet(0, 5));//array索引为0的值更新为6
原子更新引用类型
包含3个类:AtomicReference,AtomicReferenceFieldUpdater,AtomicMarkableReference
User user = new User("www",20);
User user1 = new User("ww", 5);
AtomicReference<User> reference = new AtomicReference<>();
reference.set(user);
reference.compareAndSet(user, user1);
System.out.println(reference.get().getName()); //[5, 6]
原子更新字段类
原子更新某个类里的某个字段:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicStampedReference
要想原子的更新字段有两步:
1.使用静态方法newUpdater创建一个更新器,并且设置欲更新的类和属性
2.更新类的字段必须使用public volatile修饰符
AtomicIntegerFieldUpdater<User> atomicIntegerFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");
//User有一个字段为age,相当于操作该字段