AtomicReference

此类可以原子性的修改引用类型的变量.

底层通过 UnSafe 实现原子性操作.

public class AtomicReference implements java.io.Serializable {
    private static final long serialVersionUID = -1848883965231344442L;

    private static final Unsafe unsafe = Unsafe.getUnsafe();    

		 *  记录value字段相对于对象的起始内存地址的字节偏移量,主要是为了在更新操作在内存中找到value的位置,方便比较。
		 */
		private static final long valueOffset;
		static 
					try 
							valueOffset = unsafe.objectFieldOffset (AtomicReference.class.getDeclaredField("value")); 
			} catch (Exception ex) 
							throw new Error(ex); 
							
		private volatile V value; 
		
		public final V get() { 
			return value;
					
		public final void set(V newValue) { 
			value = newValue; 
			}
		}
构造方法可传参与否都行
    public AtomicReference(V initialValue) {
        value = initialValue;
    }

    public AtomicReference() {
    }

关于此类的 get() 和 set() 未使用 unsafe 实现原子性操作的原因:

    set() : 因为提供的空的构造方法,所以set() 使用来给 value 属性赋值的操作,用于初始化value.所以不必使用 unsafe 实现

    若要原子性更新对象,可调用compareAndSet()

   get() : 相比较于set() 更好理解,因为 value 用 volatile 修饰,所以 返回的对象必然是最新的.(volatile 修饰的变量在修改后对于其他线程来说是立即可见的)

    所以说这两个方法可以不用 unsafe 实现


    以此祭奠我思考了十几分钟的时间

        

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