JAVA并发包之原子操作类简介
这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作在性能上有很大提高。
基本类型
int addAndGet(int value) 以原子方式将输入的数值实例中的值相加,并返回结果
boolean compareAndSet(int expect,int update)如果输入的数值等于预期值,则以原子方式将该值设置为输入的值
int getAndIncrement()以原子的方式将当前值加1(返回的是自增前的值)
void lazySet(int newValue) 最终会设置成newValue,可能会导致其他线程在之后的一段时间内可以读到旧值
int getAndSet(int newValue) 以原子方式设置为newValue,并返回旧值
public class AtomicIntegerTest{
static AtomicInteger ai = new AtomicInteger(1);
public static void main(String[] args){
System.out.println(ai.getAndIncrement());//1
System.out.println(ai.get());//2
}
}
数组类型
int addAndGet(int i,int value)以原子方式将输入值与数组中索引i的元素相加
boolean compareAndSet(int i,int expect,int update)如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值
public class AtomicIntegerArrayTest{
static int[] value = new int[]{1,2,3};
static AtomicIntegerArray ai = new AtomicIntegerArray(value);
public static void main(String[] args){
ai.getAndSet(0,3);
System.out.println(ai.get(0));//3
System.out.println(value[0]);//1
}
}
public class AtomicReferenceTest{
public static AtomicReference<User> atomicUserRef = new AtomicReference<>();
public static void main(String[] args){
User user = new User("jordan",23);
atomicUserRef.set(user);
User updateUser = new User("james",23);
atomicUserRef.compareAndSet(user,updateUser);//进行原子操作
System.out.println(atomicUserRef.get().getName());
System.out.println(atomicUserRef.get().getAge());
}
static class User{
private String name;
private int age;
public User(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
}
public class AtomicIntegerFieldUpdaterTest{
private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdate(User.class, "age");
public static void main(String[] args){
User jordan = new User("jordan",23);
System.out.println(a.getAndIncrement(jordan));//23
System.our.println(a.get(jordan));//24
}
}
JDK8新增
以Long型为例
查看7道真题和解析
