src/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java

Print this page

        

*** 114,124 **** * necessarily with respect to other changes in the field. * * @param obj An object whose field to conditionally set * @param expect the expected value * @param update the new value ! * @return true if successful. */ public abstract boolean compareAndSet(T obj, V expect, V update); /** * Atomically sets the field of the given object managed by this updater --- 114,124 ---- * necessarily with respect to other changes in the field. * * @param obj An object whose field to conditionally set * @param expect the expected value * @param update the new value ! * @return true if successful */ public abstract boolean compareAndSet(T obj, V expect, V update); /** * Atomically sets the field of the given object managed by this updater
*** 132,142 **** * appropriate alternative to {@code compareAndSet}. * * @param obj An object whose field to conditionally set * @param expect the expected value * @param update the new value ! * @return true if successful. */ public abstract boolean weakCompareAndSet(T obj, V expect, V update); /** * Sets the field of the given object managed by this updater to the --- 132,142 ---- * appropriate alternative to {@code compareAndSet}. * * @param obj An object whose field to conditionally set * @param expect the expected value * @param update the new value ! * @return true if successful */ public abstract boolean weakCompareAndSet(T obj, V expect, V update); /** * Sets the field of the given object managed by this updater to the
*** 174,189 **** * @param obj An object whose field to get and set * @param newValue the new value * @return the previous value */ public V getAndSet(T obj, V newValue) { ! for (;;) { ! V current = get(obj); ! if (compareAndSet(obj, current, newValue)) ! return current; } - } private static final class AtomicReferenceFieldUpdaterImpl<T,V> extends AtomicReferenceFieldUpdater<T,V> { private static final Unsafe unsafe = Unsafe.getUnsafe(); private final long offset; --- 174,189 ---- * @param obj An object whose field to get and set * @param newValue the new value * @return the previous value */ public V getAndSet(T obj, V newValue) { ! V prev; ! do { ! prev = get(obj); ! } while (!compareAndSet(obj, prev, newValue)); ! return prev; } private static final class AtomicReferenceFieldUpdaterImpl<T,V> extends AtomicReferenceFieldUpdater<T,V> { private static final Unsafe unsafe = Unsafe.getUnsafe(); private final long offset;
*** 319,328 **** --- 319,337 ---- if (obj == null || obj.getClass() != tclass || cclass != null) targetCheck(obj); return (V)unsafe.getObjectVolatile(obj, offset); } + @SuppressWarnings("unchecked") + public V getAndSet(T obj, V newValue) { + if (obj == null || obj.getClass() != tclass || cclass != null || + (newValue != null && vclass != null && + vclass != newValue.getClass())) + updateCheck(obj, newValue); + return (V)unsafe.getAndSetObject(obj, offset, newValue); + } + private void ensureProtectedAccess(T obj) { if (cclass.isInstance(obj)) { return; } throw new RuntimeException(