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(