This article brings you an introduction to the decrementAndGet method of AtomicInteger (with code). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.
unsafe.objectFieldOffset
Call unsafe.objectFieldOffset to get the offset of the value field in the object (actually the offset from a field to the head of the object, passed This offset can quickly locate the field)
static { try { valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } }
Define value as a volatile type to ensure the visibility of value in multiple threads
private volatile int value;
decrementAndGet
Call unsafe.getAndAddInt, the parameters are the current object, offset, and operation value
/** * Atomically decrements by one the current value. * * @return the updated value */ public final int decrementAndGet() { //最后-1是由于getAndAddInt获取的值为交换前的值 return unsafe.getAndAddInt(this, valueOffset, -1) - 1; }
getAndAddInt
Get the latest memory value by comparingAndSwapInt and returning to the loop getIntVolatile
public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5; }
getIntVolatile
The method contains two parameters, the current object and the offset; obtains the integer pointed to by the memory address and supports volatile semantics
public native int getIntVolatile(Object var1, long var2);
compareAndSwapInt
The method contains four parameters, the current object, offset, expected value, and new value; if the value of the offset corresponding to the current object is the same as the expected value, the current object's The value is changed to the new value and returns true; otherwise returns false
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
The above is the detailed content of Introduction to the decrementAndGet method of AtomicInteger (with code). For more information, please follow other related articles on the PHP Chinese website!