이 글은 AtomicInteger의 decrementAndGet 메소드(코드 포함)를 소개합니다. 이는 특정 참조 값을 가지고 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
unsafe.objectFieldOffset
unsafe.objectFieldOffset을 호출하여 객체의 값 필드 오프셋을 가져옵니다(실제로 필드를 빠르게 찾을 수 있는 필드에서 객체 헤드까지의 오프셋)
static { try { valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } }
다중 스레드에서 값의 가시성을 보장하기 위해 값을 휘발성 유형으로 정의합니다
private volatile int value;
decrementAndGet
unsafe.getAndAddInt를 호출합니다. 매개변수는 현재 개체, 오프셋 및 작업 값입니다
/** * 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
By CompareAndSwapInt 최신 메모리 값을 가져오기 위해 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
이 메서드에는 현재 객체와 오프셋이라는 두 개의 매개변수가 포함되어 있으며 메모리 주소가 가리키는 정수를 가져오고 휘발성 의미를 지원합니다
public native int getIntVolatile(Object var1, long var2);
CompareAndSwapInt
메서드에는 현재 개체, 오프셋, 예상 값, 새 값의 네 가지 매개 변수가 포함됩니다. 현재 개체에 해당하는 오프셋 값이 예상 값과 동일하면 현재 개체의 값을 새 개체로 변경합니다. 값을 입력하고 true를 반환합니다. 그렇지 않으면 false를 반환합니다
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
위 내용은 AtomicInteger의 decrementAndGet 메서드 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!