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

Print this page

        

*** 157,204 **** * @param obj An object whose field to get and set * @param newValue the new value * @return the previous value */ public int getAndSet(T obj, int newValue) { ! for (;;) { ! int current = get(obj); ! if (compareAndSet(obj, current, newValue)) ! return current; } - } /** * Atomically increments by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the previous value */ public int getAndIncrement(T obj) { ! for (;;) { ! int current = get(obj); ! int next = current + 1; ! if (compareAndSet(obj, current, next)) ! return current; } - } /** * Atomically decrements by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the previous value */ public int getAndDecrement(T obj) { ! for (;;) { ! int current = get(obj); ! int next = current - 1; ! if (compareAndSet(obj, current, next)) ! return current; } - } /** * Atomically adds the given value to the current value of the field of * the given object managed by this updater. * --- 157,204 ---- * @param obj An object whose field to get and set * @param newValue the new value * @return the previous value */ public int getAndSet(T obj, int newValue) { ! int prev; ! do { ! prev = get(obj); ! } while (!compareAndSet(obj, prev, newValue)); ! return prev; } /** * Atomically increments by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the previous value */ public int getAndIncrement(T obj) { ! int prev, next; ! do { ! prev = get(obj); ! next = prev + 1; ! } while (!compareAndSet(obj, prev, next)); ! return prev; } /** * Atomically decrements by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the previous value */ public int getAndDecrement(T obj) { ! int prev, next; ! do { ! prev = get(obj); ! next = prev - 1; ! } while (!compareAndSet(obj, prev, next)); ! return prev; } /** * Atomically adds the given value to the current value of the field of * the given object managed by this updater. *
*** 205,253 **** * @param obj An object whose field to get and set * @param delta the value to add * @return the previous value */ public int getAndAdd(T obj, int delta) { ! for (;;) { ! int current = get(obj); ! int next = current + delta; ! if (compareAndSet(obj, current, next)) ! return current; } - } /** * Atomically increments by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the updated value */ public int incrementAndGet(T obj) { ! for (;;) { ! int current = get(obj); ! int next = current + 1; ! if (compareAndSet(obj, current, next)) return next; } - } /** * Atomically decrements by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the updated value */ public int decrementAndGet(T obj) { ! for (;;) { ! int current = get(obj); ! int next = current - 1; ! if (compareAndSet(obj, current, next)) return next; } - } /** * Atomically adds the given value to the current value of the field of * the given object managed by this updater. * --- 205,253 ---- * @param obj An object whose field to get and set * @param delta the value to add * @return the previous value */ public int getAndAdd(T obj, int delta) { ! int prev, next; ! do { ! prev = get(obj); ! next = prev + delta; ! } while (!compareAndSet(obj, prev, next)); ! return prev; } /** * Atomically increments by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the updated value */ public int incrementAndGet(T obj) { ! int prev, next; ! do { ! prev = get(obj); ! next = prev + 1; ! } while (!compareAndSet(obj, prev, next)); return next; } /** * Atomically decrements by one the current value of the field of the * given object managed by this updater. * * @param obj An object whose field to get and set * @return the updated value */ public int decrementAndGet(T obj) { ! int prev, next; ! do { ! prev = get(obj); ! next = prev - 1; ! } while (!compareAndSet(obj, prev, next)); return next; } /** * Atomically adds the given value to the current value of the field of * the given object managed by this updater. *
*** 254,270 **** * @param obj An object whose field to get and set * @param delta the value to add * @return the updated value */ public int addAndGet(T obj, int delta) { ! for (;;) { ! int current = get(obj); ! int next = current + delta; ! if (compareAndSet(obj, current, next)) return next; } - } /** * Standard hotspot implementation using intrinsics */ private static class AtomicIntegerFieldUpdaterImpl<T> extends AtomicIntegerFieldUpdater<T> { --- 254,270 ---- * @param obj An object whose field to get and set * @param delta the value to add * @return the updated value */ public int addAndGet(T obj, int delta) { ! int prev, next; ! do { ! prev = get(obj); ! next = prev + delta; ! } while (!compareAndSet(obj, prev, next)); return next; } /** * Standard hotspot implementation using intrinsics */ private static class AtomicIntegerFieldUpdaterImpl<T> extends AtomicIntegerFieldUpdater<T> {
*** 359,368 **** --- 359,398 ---- public final int get(T obj) { if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj); return unsafe.getIntVolatile(obj, offset); } + public int getAndSet(T obj, int newValue) { + if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj); + return unsafe.getAndSetInt(obj, offset, newValue); + } + + public int getAndIncrement(T obj) { + return getAndAdd(obj, 1); + } + + public int getAndDecrement(T obj) { + return getAndAdd(obj, -1); + } + + public int getAndAdd(T obj, int delta) { + if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj); + return unsafe.getAndAddInt(obj, offset, delta); + } + + public int incrementAndGet(T obj) { + return getAndAdd(obj, 1) + 1; + } + + public int decrementAndGet(T obj) { + return getAndAdd(obj, -1) - 1; + } + + public int addAndGet(T obj, int delta) { + return getAndAdd(obj, delta) + delta; + } + private void ensureProtectedAccess(T obj) { if (cclass.isInstance(obj)) { return; } throw new RuntimeException(