Java多线程Day15-JUC原子类之AtomicReference

147 阅读2分钟

AtomicReference

基本概念

  • AtomicReference的作用是对引用对象进行原子操作

AtomicReference函数列表

AtomicReference

/**
 * 使用null初始值创建新的AtomicReference
 */
public AtomicReference() {
}

/**
 * 使用给定的初始值创建新的AtomicReference
 * 
 * @param initialValue 给定的初始值
 */
public AtomicReference(V initialValue) {
        value = initialValue;
    }

compareAndSet

/**
 * 如果当前值等于预期值,则将当前值设置为给定的更新值
 * 
 * @param expect 预期值
 * @param update 更新值
 * @return boolean 是否更新成功
 */
public final boolean compareAndSet(V expect, V update) {
	return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}

get

/**
 * 获取当前值
 * 
 * @return V 当前值  
 */
public final V get() {
	return value;
}

getAndSet

/**
 * 使用原子的方式将值更新为给定的值,并返回更新前的值
 *  
 * @param newValue 给定的更新值
 * @return V 更新前的值 
 */
public final V getAndSet(V newValue) {
	return (V)unsafe.getAndSetObject(this, valueOffset, newValue);
}

lazySet

/**
 * 懒设置,最终设置为给定的值
 *  
 * @param newValue 给定的更新值 
 */
public final void lazySet(V newValue) {
	unsafe.putOrderedObject(this, valueOffset, newValue);
}

set

/**
 * 设置为给定的新值
 *  
 * @param newValue 给定的更新值 
 */
public final void set(V newValue) {
	value = newValue;
}

toString

/**
 * 返回当前值的字符串表示形式
 *  
 * @return String 当前值的字符串表示形式
 */
public String toString() {
	return String.valueOf(get());
}

weakCompareAndSet

/**
 * 如果当前值等于预期值,则以原子的方式将当前值设置为给定的更新值
 *  
 * @param expect 预期值
 * @param update 给定的更新值
 * @return boolean 是否更新成功
 */
public final boolean weakCompareAndSet(V expect, V update) {
	return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}

AtomicReference源码

  • AtomicReference是通过volatileUnsafe提供的CAS实现原子操作

    • value值是volatile类型

      • 当某个线程修改value值时,其余线程获取的值都是最新的value值,也就是修改之后的volatile
    • 通过CAS设置value:

      • 当某个线程池通过CAS函数设置value时,操作是原子的,也就是线程在操作value时不会被中断