一、简介
java.util.concurrent并发包给咱们提供了12个原子操作类,它们属于四种类型的原子更新,别离是原子更新根本类型、原子更新数组、原子更新援用类型和原子更新属性。
这些原子操作类外部都是通过Unsafe类提供的一些本地办法(原子操作)来实现的,如大家相熟的CAS操作compareAndSwapInt,从主存中读取最新值getIntVolatile等。
二、原子更新的类型
2.1 原子更新根本类型
以原子的形式更新根本类型,atomic包提供了3个类:
- AtomicBoolean:原子更新布尔类型
- AtomicInteger:原子更新整型
- AtomicLong:原子更新长整型
以上3个类提供的办法根本一样,如AtomicInteger的局部办法如下:
// 以原子形式将输出的值与实例中的值相加,并返回相加后的值int addAndGet(int delta)// 如果输出的值等于预期值,则以原子形式将该值设置为输出的值,胜利返回true,否则返回falseboolean compareAndSet(int expect, int update)// 以原子形式将以后的值加1,返回自增前的值int getAndIncrement()// 以原子形式设置newValue的值,并返回旧值int getAndSet(int newValue)
2.2 原子更新数组
以原子的形式更新数组里的某个元素,atomic包提供了3个类:
- AtomicIntegerArray:原子更新整型数组里的元素
- AtomicLongArray:原子更新长整型数组里的元素
- AtomicReferenceArray:原子更新援用类型数组的元素
这里以AtomicIntegerArray为例,其次要是以原子的形式来更新数组里的整型,局部办法如下:
// 以原子形式将输出值与数组中索引i的元素相加,并返回int addAndGet(int i, int delta) // 如果以后值等于预期值,则以原子形式将数组地位i的元素设置成update值,胜利返回true,否则返回falseboolean compareAndSet(int i, int expect, int update)
2.3 原子更新援用类型
以原子的形式更新援用类型,atomic包提供了3个类:
- AtomicReference:原子更新援用类型
- AtomicStampedReference:原子更新带有版本号的援用类型,能够解决ABA问题
- AtomicMarkableReference:原子更新带有标记位的援用类型
这里以AtomicReference为例,其次要是以原子的形式来更新援用类型,局部办法如下:
// 如果以后value指向的对象与expect指向的对象是同一个,则以原子的形式将value更新为update,即value指向了update所指向的对象。boolean compareAndSet(V expect, V update) // 以原子的形式将value更新为newValue,并返回value的旧值V getAndSet(V newValue)
2.4 原子更新属性
以原子的形式更新对象里的属性,atomic包提供了3个类:
- AtomicIntegerFieldUpdater:原子更新整型属性
- AtomiceLongFieldUpdater:原子更新长整型属性
- AtomicReferenceFieldUpdater:原子更新援用类型的属性
应用时必须先应用静态方法newUpdater()创立一个更新器,并且传入想要更新的类和属性名。
留神:要更新的字段必须是volatile类型的。
样例如下:
private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");public static class User{ private String name; public volatile int age;}