2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
7 package java.util.concurrent.atomic;
8 import sun.misc.Unsafe;
11 * An object reference that may be updated atomically. See the {@link
12 * java.util.concurrent.atomic} package specification for description
13 * of the properties of atomic variables.
16 * @param <V> The type of object referred to by this reference
18 public class AtomicReference<V> implements java.io.Serializable {
19 private static final long serialVersionUID = -1848883965231344442L;
21 private static final Unsafe unsafe = Unsafe.getUnsafe();
22 private static final long valueOffset;
26 valueOffset = unsafe.objectFieldOffset
27 (AtomicReference.class.getDeclaredField("value"));
28 } catch (Exception ex) { throw new Error(ex); }
31 private volatile V value;
34 * Creates a new AtomicReference with the given initial value.
36 * @param initialValue the initial value
38 public AtomicReference(V initialValue) {
43 * Creates a new AtomicReference with null initial value.
45 public AtomicReference() {
49 * Gets the current value.
51 * @return the current value
53 public final V get() {
58 * Sets to the given value.
60 * @param newValue the new value
62 public final void set(V newValue) {
67 * Eventually sets to the given value.
69 * @param newValue the new value
72 public final void lazySet(V newValue) {
73 unsafe.putOrderedObject(this, valueOffset, newValue);
77 * Atomically sets the value to the given updated value
78 * if the current value <tt>==</tt> the expected value.
79 * @param expect the expected value
80 * @param update the new value
81 * @return true if successful. False return indicates that
82 * the actual value was not equal to the expected value.
84 public final boolean compareAndSet(V expect, V update) {
85 return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
89 * Atomically sets the value to the given updated value
90 * if the current value <tt>==</tt> the expected value.
91 * May fail spuriously and does not provide ordering guarantees,
92 * so is only rarely an appropriate alternative to <tt>compareAndSet</tt>.
94 * @param expect the expected value
95 * @param update the new value
96 * @return true if successful.
98 public final boolean weakCompareAndSet(V expect, V update) {
99 return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
103 * Atomically sets to the given value and returns the old value.
105 * @param newValue the new value
106 * @return the previous value
108 public final V getAndSet(V newValue) {
111 if (compareAndSet(x, newValue))
117 * Returns the String representation of the current value.
118 * @return the String representation of the current value.
120 public String toString() {
121 return String.valueOf(get());