目录
在一个类之中可能会存在有若干个不同的属性,但是有可能在进行线程同步处理的时候,不是该类中所有的属性都会被进行所谓的同步操作,只有部分的属性进行同步处理操作,所以在J.U.C 提供的原子类型里面,就包含有一个属性修改器,利用属性修改器可以安全的修改属性的内容。原子开发包中属性修改器一共包含三种:AtomicIntegerFieldUpdater(原子整形成员修改器)、AtomicLongFieldUpdater(原子长整形修改器)、AtomicReferenceFieldUpdater(原子引用成员修改器)
AtomicLongFieldUpdater
常用方法
首先AtomicLongFieldUpdater 是一个抽象类,所以如果要想使用那么必须找到其对应的实现子类,这个时候可以分析一下该类的源代码之中的定义。
源码:
public abstract class AtomicLongFieldUpdater<T> {
@CallerSensitive
public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass,
String fieldName) {
Class<?> caller = Reflection.getCallerClass();
if (AtomicLong.VM_SUPPORTS_LONG_CAS)
return new CASUpdater<U>(tclass, fieldName, caller);
else
return new LockedUpdater<U>(tclass, fieldName, caller);
}
}
按照以上结构的概念来讲是应该分为两种实现器的实现,一种是基于CAS 的方式实现的,另外一种是基于锁定的方式来实现的,而这两种实现是需要根据一些环境的参数来决定的
范例:观察原子性的属性修改器
class BookLongFiled{
// 1.属性必须使用 Volatile
volatile long id;
}
public class AtomicLongFieldUpdaterTest {
@Test
public void longFiledTest(){
// 通过newUpdater() 方法得到
AtomicLongFieldUpdater longFieldUpdater
= AtomicLongFieldUpdater.newUpdater(BookLongFiled.class,"id");
System.out.println(longFieldUpdater.getClass());
}
}
// 结果:class java.util.concurrent.atomic.AtomicLongFieldUpdater$CASUpdater
此时默认的环境中,可以直接使用CAS的方式来实现修改器的对象实例获取,但是需要进行修改器处理的属性必须使用 volatile 关键字来进行定义,当然了,按照正常的使用来讲,此时的操作应该是在一个类的内部完成的。
范例:使用属性修改器
class BookLongFiled {
// 1.属性必须使用 Volatile,否者就会出现运行时异常
private volatile long id;
private String title;
private double price;
public BookLongFiled(long id, String title, double price) {
this.id = id;
this.title = title;
this.price = price;
}
// 这个时候的 ID 是需要进行同步处理操作的
public void setId(long id) {
AtomicLongFieldUpdater updater =
AtomicLongFieldUpdater.newUpdater(BookLongFiled.class, "id");
// CSA的修改操作
updater.compareAndSet(this, this.id, id);
}
@Override
public String toString() {
return "【图书】ID:" + this.id + "、名称:" + this.title + "、价格:" + this.price;
}
}
public class AtomicLongFieldUpdaterTest {
@Test
public void longFiledTest() {
// 1、实例化 数据对象
BookLongFiled book = new BookLongFiled(1002, "JUC 学习之路", 89.99);
book.setId(1003);
System.out.println(book);
}
}
// 执行结果:【图书】ID:1003、名称:JUC 学习之路、价格:89.99
在整个的J.U.C 的设计过程之中,不同的同步场景需要使用不同的原子类来完成处理的,除了要清除每一个原子类的使用特点之外,对于其实现的源码机制也要有认知