1 总结
在java.util.concurrent.atomic 包下
- 原子更新方式**
- 原子更新基本类型
- 原子更新数组
- 原子更新引用
- 原子更新属性(字段)
- 原子更新基本类型
- AtomicBoolean :原子更新布尔类型
- AtomicInteger: 原子更新整型
- AtomicLong: 原子更新长整型
- 原子更新数组
- AtomicIntegerArray :原子更新整型数组里的元素
- AtomicLongArray :原子更新长整型数组里的元素
- AtomicReferenceArray : 原子更新引用类型数组的元素
- AtomicBooleanArray :原子更新布尔类型数组的元素
- 原子更新引用类型
- AtomicReference :原子更新引用类型
- AtomicReferenceFieldUpdater :原子更新引用类型里的字段
- AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和应用类型
- 原子更新字段类
- AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
- AtomicLongFieldUpdater:原子更新长整型字段的更新器
- AtomicStampedReference:原子更新带有版本号的引用类型。该类将整型数值与引用关联起来,可用于原子的更新数据和数据的版本号,可以解决使用CAS进行原子更新时可能出现的ABA问题。
2 用例
2.1 AtomicInteger
原子操作一般用来操作共享变量,所以一般是用来包装
一个类的静态成员变量
:
public class AtomicIntegerDemo {
private static AtomicInteger atomicInteger = new AtomicInteger(0);
public static void main(String[] args){
for (int i = 0; i < 5; i++){
new Thread(new Runnable() {
public void run() {
//调用AtomicInteger的getAndIncement返回的是增加之前的值
System.out.println(atomicInteger.getAndIncrement());
}
}).start();
}
System.out.println(atomicInteger.get());
}
}
2.2 AtomicIntegerArray
常用的方法有:
int addAndSet(int index, int delta)
:以原子方式将输入值与数组中索引为index的元素相加boolean compareAndSet(int index, int expect, int update)
:如果当前值等于预期值,则以原子方式更新数组中索引为index的值为update值
示例代码如下:
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]);
}
}
输出:
3
1
注意:数组value通过构造的方式传入AtomicIntegerArray中,实际上AtomicIntegerArray会将当前数组拷贝一份,所以在数组拷贝的操作不影响原数组的值。
2.3 AtomicReference
public static AtomicReference<User> ar = new AtomicReference<User>();
public static void main(String[] args){
User user = new User("aa",11);
ar.set(user);
User newUser = new User("bb",22);
ar.compareAndSet(user,newUser);
System.out.println(ar.get().getName());
System.out.println(ar.get().getId());
}
2.4 AtomicReferenceFieldUpdater
class Dog {
volatile String name;
}
AtomicReferenceFieldUpdater updater=AtomicReferenceFieldUpdater.newUpdater(Dog.class,String.class,"name");
Dog dog1=new Dog("Yellow");
updater.compareAndSet(dog1,dog1.name,"Green") ;
System.out.println(dog1.name);