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 Object/*V*/ value;
34 * Creates a new AtomicReference with the given initial value.
36 * @param initialValue the initial value
38 public AtomicReference(Object/*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 Object/*V*/ get() {
58 * Sets to the given value.
60 * @param newValue the new value
62 public final void set(Object/*V*/ newValue) {
67 * Eventually sets to the given value.
69 * @param newValue the new value
72 public final void lazySet(Object/*V*/ newValue) {
76 //unsafe.putOrderedObject(this, valueOffset, newValue);
80 * Atomically sets the value to the given updated value
81 * if the current value <tt>==</tt> the expected value.
82 * @param expect the expected value
83 * @param update the new value
84 * @return true if successful. False return indicates that
85 * the actual value was not equal to the expected value.
87 public final boolean compareAndSet(Object/*V*/ expect, Object/*V*/ update) {
96 //return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
100 * Atomically sets the value to the given updated value
101 * if the current value <tt>==</tt> the expected value.
102 * May fail spuriously and does not provide ordering guarantees,
103 * so is only rarely an appropriate alternative to <tt>compareAndSet</tt>.
105 * @param expect the expected value
106 * @param update the new value
107 * @return true if successful.
109 public final boolean weakCompareAndSet(Object/*V*/ expect, Object/*V*/ update) {
110 synchronized (this) {
111 if(expect == value) {
118 //return unsafe.compareAndSwapObject(this, valueOffset, expect, update);\
122 * Atomically sets to the given value and returns the old value.
124 * @param newValue the new value
125 * @return the previous value
127 public final Object/*V*/ getAndSet(Object/*V*/ newValue) {
129 Object/*V*/ x = get();
130 if (compareAndSet(x, newValue))
136 * Returns the String representation of the current value.
137 * @return the String representation of the current value.
139 /*public String toString() {
140 return String.valueOf(get());