AtomicIntegerFieldUpdater


此类针对某一个类的 volatile int 字段有原子性要求

    对字段的原子性操作底层通过 UnSafe 实现

  • 字段必须是volatile类型的,在线程之间共享变量时保证立即可见
  • 字段的描述类型(修饰符public/protected/default/private)是与调用者与操作对象字段的关系一致。也就是说调用者能够直接操作对象字段,那么就可以反射进行原子操作。
  • 对于父类的字段,子类是不能直接操作的,尽管子类可以访问父类的字段。
  • 只能是实例变量,不能是类变量,也就是说不能加static关键字。
  • 只能是可修改变量,不能使final变量,因为final的语义就是不可修改。
  • 对于AtomicIntegerFieldUpdater和AtomicLongFieldUpdater只能修改int/long类型的字段,不能修改其包装类型(Integer/Long)。如果要修改包装类型就需要使用AtomicReferenceFieldUpdater。
public abstract class AtomicIntegerFieldUpdater {

	// 构造方法同一个package及子类可调用
	protected AtomicIntegerFieldUpdater() {
	}

	// AtomicIntegerFieldUpdater是一个抽象类,但是它内部有一个private final类型的默认子类,
	// 所以在调用newUpdater的时候,返回一个 AtomicIntegerFieldUpdaterImpl 实例
	// 一般通过该实例调用相关方法
	@CallerSensitive
	public static  AtomicIntegerFieldUpdater newUpdater(Class tclass, String fieldName) {
		return new AtomicIntegerFieldUpdaterImpl(tclass, fieldName, Reflection.getCallerClass());
	}
}

public class Demo {

	volatile int number;

	public static void main(String[] args) {

		AtomicIntegerFieldUpdater newUpdater = AtomicIntegerFieldUpdater.newUpdater(Demo.class, "number");
		newUpdater.incrementAndGet(new Demo());
	}
}


你可能感兴趣的:(JAVA并发基础类库)