Home  >  Article  >  Java  >  Introduction to the decrementAndGet method of AtomicInteger (with code)

Introduction to the decrementAndGet method of AtomicInteger (with code)

不言
不言forward
2019-02-21 14:56:064577browse

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!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete