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型为例