基本概念
  • AtomicLongFieldUpdater可以对指定的类的volatile long类型的成员进行原子更新.是基于反射的原理实现的
AtomicLongFieldUpdater函数列表

AtomicLongFieldUpdater

/**
 * 供子类使用的无操作构造方法
 */
protected AtomicLongFieldUpdater() {
}

addAndGet

/**
 * 以原子的方式将给定值和更新器管理的给定对象的当前值相加,并返回相加后的值
 *  
 * @param obj 给定的更新器管理的对象
 * @param delta 给定的值
 * @return long 相加后的值
 */
public long addAndGet(T obj, long delta) {
	long prev, next;
	do {
		prev = get(obj);
		next = prev + delta;
	} while (!compareAndSet(obj, prev, next));
	return next;
}

compareAndSet

/**
 * 如果当前值等于期望值,则以原子的方式将更新器管理的对象的字段的当前值设置为给定的更新值
 *  
 * @param obj 给定的更新器管理的对象
 * @param expect 期望值
 * @param update 给定的更新值
 * @return boolean 是否更新成功
 */
public abstract boolean compareAndSet(T obj, long expect, long update);

decrementAndGet

/**
 * 以原子的方式将更新器管理的给定的对象的字段的当前值减1,返回相减后的值
 *  
 * @param obj 给定的更新器管理的对象
 * @return long 相减后的值
 */
public long decrementAndGet(T obj) {
	long prev, next;
	do {
		prev = get(obj);
		next = prev - 1;
	} while (!compareAndSet(obj, prev, next));
	return next;
}

get

/**
 * 获取更新器管理的给定的对象的当前值
 *  
 * @param obj 给定的更新器管理的对象
 * @return long 对象的当前值
 */
public abstract long get(T obj);

getAndAdd

/**
 * 以原子的方式将给定的值和给定的更新器管理的对象的字段的当前值相加,并返回相加前的值
 *  
 * @param obj 给定的更新器管理的对象
 * @param delta 给定的值
 * @return long 相加前的值
 */
public long getAndAdd(T obj, long delta) {
	long prev, next;
	do {
		prev = get(obj);
		next = prev + delta;
	} while (!compareAndSet(obj, prev, next));
	return prev;
}

getAndDecrement

/**
 * 以原子的方式将给定的更新器管理的对象的字段的当前值减1,并返回相减前的值
 *  
 * @param obj 给定的更新器管理的对象
 * @return long 相减前的值
 */
public long getAndDecrement(T obj) {
	long prev, next;
	do {
		prev = get(obj);
		next = prev - 1;
	} while (!compareAndSet(obj, prev, next));
	return prev;
}

getAndIncrement

/**
 * 以原子的方式将给定的更新器管理的对象的字段的当前值加1,并返回相加前的值
 *  
 * @param obj 给定的更新器管理的对象
 * @return long 相加前的值
 */
public long getAndIncrement(T obj) {
	long prev, next;
	do {
		prev = get(obj);
		next = prev + 1;
	} while (!compareAndSet(obj, prev, next));
	return prev;
}

getAndSet

/**
 * 以原子的方式将给定的更新器管理的对象设置为给定的值,并且返回旧值
 *  
 * @param obj 给定的更新器管理的对象
 * @param newValue 给定的值
 * @return long 旧值
 */
public long getAndSet(T obj, long newValue) {
	long prev;
	do {
		prev = get(obj);
	} while (!compareAndSet(obj, prev, newValue));
}

incrementAndGet

/**
 * 以原子的方式将更新器管理的对象的字段的当前值加1,并返回相加后的值
 *  
 * @param obj 给定的更新器管理的对象
 * @return long 相加后的值
 */
public long incrementAndGet(T obj) {
	long prev, next;
	do {
		prev = get(obj);
		next = prev + 1;
	} while (!compareAndSet(obj, prev, next));
	return next;
}

lazySet

/**
 * 最终将更新器管理的对象的字段的值设置为给定的更新值
 *  
 * @param obj 给定的更新器管理的对象
 * @param newValue 更新值
 */
public abstract void lazySet(T obj, long newValue);

newUpdater

/**
 * 创建并返回一个具有给定字段的更新器
 *  
 * @param tclass 存放字段的类对象
 * @param fieldName 给定字段的名称
 * @return <U> AtomicLongFieldUpdater<U> 更新器
 */
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);
}

set

/**
 * 以原子的方式将给定的更新器管理的对象的字段设置为给定的更新值
 *  
 * @param obj 给定的更新器管理的对象
 * @param newValue 更新值
 */
public abstract void set(T obj, long newValue);

weakCompareAndSet

/**
 * 如果当前值等于期望值,则以原子的方式将给定的更新器管理的对象的字段值设置为给定的更新值
 *  
 * @param obj 给定的更新器管理的对象
 * @param expect 期望值
 * @param update 更新值
 * @return boolean 是否更新成功
 */
public abstract boolean weakCompareAndSet(T obj, long expect, long update);
AtomicLongFieldUpdater源码

newUpdater

@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);
}
  • newUpdater() 作用是获取一个AtomicLongFieldUpdater类型的对象
    • 实际上返回的是CASUpdater对象或者LockUpdater对象
    • 具体返回哪一个类取决于JVM是否支持long类型的CAS函数
    • CASUpdater类和LockUpdater类都是AtomicLongFieldUpdater的子类