Java多线程:“JUC原子类”04之AtomicReference原子类2014-06-02 如果天空不死 AtomicReference介绍和函数列表AtomicReference是作用是对"对象"进行原子操作。AtomicReference函数列表
// 使用 null 初始值创建新的 AtomicReference。AtomicReference()// 使用给定的初始值创建新的 AtomicReference。AtomicReference(V initialValue)// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。boolean compareAndSet(V expect, V update)// 获取当前值。V get()// 以原子方式设置为给定值,并返回旧值。V getAndSet(V newValue)// 最终设置为给定值。void lazySet(V newValue)// 设置为给定值。void set(V newValue)// 返回当前值的字符串表示形式。String toString()// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。boolean weakCompareAndSet(V expect, V update)
AtomicReference源码分析(基于JDK1.7.0_40)在JDK1.7.0_40中AtomicReference.java的源码如下:
public class AtomicReference<V>implements java.io.Serializable {private static final long serialVersionUID = -1848883965231344442L;// 获取Unsafe对象,Unsafe的作用是提供CAS操作private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;static {try {valueOffset = unsafe.objectFieldOffset(AtomicReference.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }}// volatile类型private volatile V value;public AtomicReference(V initialValue) {value = initialValue;}public AtomicReference() {}public final V get() {return value;}public final void set(V newValue) {value = newValue;}public final void lazySet(V newValue) {unsafe.putOrderedObject(this, valueOffset, newValue);}public final boolean compareAndSet(V expect, V update) {return unsafe.compareAndSwapObject(this, valueOffset, expect, update);}public final boolean weakCompareAndSet(V expect, V update) {return unsafe.compareAndSwapObject(this, valueOffset, expect, update);}public final V getAndSet(V newValue) {while (true) {V x = get();if (compareAndSet(x, newValue))return x;}}public String toString() {return String.valueOf(get());}}