AtomicInteger 소스 코드 학습
private static final Unsafe unsafe = Unsafe.getUnssafe();
private static final long offsetValue;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField('value'));
}catch(Exception e){throw new Error(e);}
}
private volatile int value;
자, 이어서 몇 가지 방법 을 말 해 보 세 요.
/** */
public final void set(int newValue){value = newValue;}
/**
*Eventually sets the given value
* 1.6
*/
public final void lazySet(int newValue){
unsafe.putOrderInt(this,valueOffset,newValue);
}
/**
*Atomically sets to the given value and returns the old
* value.
* ,
*/
public final int getAndSet(int newValue){
return unsafe.getAndSetInt(this,valueOffset,newValue);
}
/**
*Atomically sets the value to the given updated value
*if the current value == the expect value
* (valueOffset ) (expect),
* update
*@return true, false
*/
public fianl boolean compareAndSet(int expect,int update){
return unsafe.compareAndSwapInt(this,valueOffset,
expect,update);
}
위의 방법 은 현재 값 을 주어진 값 으로 수정 하 는 것 입 니 다. 다음은 다른 그룹 이 일정한 증분 에 따라 현재 값 을 증가 (감소) 하 는 것 을 보 겠 습 니 다.
/**
*Atomically increments by one the current value
* 1
*
*/
public fianl int getAndIncrement(){
return unsafe.getAndAddInt(this,valueOffset,1);
}
/**
* getAndIncrement ,
*/
public final int incrementAndGet(){
return unsafe.getAndAddInt(this,valueOffset,1)+1;
}
/**
* 1
*
*/
public final int getAndDecrement(){
return unsafe.getAndAddInt(this,valueOffset,-1);
}
/**
* 1
*
*/
public final int decrementAndGet(){
return unsafe.getAndAddInt(this,valueOffset,-1)-1;
}
/**
*
*
*/
public final int getAndAdd(int delta){
return unsafe.getAndAddInt(this,valueOffset delta);
}
/**
*
*
*/
public final int addAndGet(int delta){
return unsafe.getAndAddInt(this,valueOffset delta)
+delta;
}
1 조 1, 8 에 추 가 된 몇 가지 방법 을 살 펴 보 겠 습 니 다.
/**
*Atomically updates the current value with the resuls
* of applying the given function,returning thre previous
* value,...it may be re-applied when attempted udates
* fail due to contention among threads.
* the given function ,
* 。
*
*/
public final int getAndUpdate(IntUnaryOperator
updateFunction){
int prev,next;
do{
prev = get();
next = updateFunction.applyAsInt(prev);
}while(!compareAndSet(prev,next));
return prev;
}
updateAndGet, 。
/**
*...The function is applied with the current value as its
*first argument,and the given update as the second
*argument.
*
*
*/
public final int getAndAccumulate(int x,
IntBinaryOperator accumulateFunction){
int prev,next;
do{
prev = get();
next = accumulateFunction.applyAsInt(prev,x);
}while(!compareAndSet(prev,next));
return prev;
}
accumulateAndGet,
getAndUpdate 와 getAndAccumulate 에 대한 두 가지 예:
@Test
public void testGetAndUpdate(){
AtomicInteger atomicInteger = new AtomicInteger(1);
//x 1, x+3
IntUnaryOperator function = x -> x + 3;
int prev = atomicInteger.getAndUpdate(function);
System.out.println("prev:"+prev+",next:"+
atomicInteger.get());
// prev:1,next:4
}
@Test
public void testAccumulateAndGet(){
AtomicInteger atomicInteger = new AtomicInteger(1);
int updateValue = 2;
//x 1,y updateValue 2, x+y
IntBinaryOperator function = (x,y)->x+y;
int prev = atomicInteger.accumulateAndGet(updateValue,
function);
System.out.println("prev:"+prev+",next:"+
atomicInteger.get());
// prev:1,next:3
}
getAndUpdate 와 accumulate AndGet 은 각각 1 원 인터페이스 인 IntUnary Operator 와 2 원 인터페이스 인 IntBinary Operator 의 구체 적 인 실현 에 의존 하고 있 으 며, 수정 전의 값 을 되 돌려 주 는 것 이 며, updateAndGet 과 getAndAccumulate 는 수 정 된 값 을 되 돌려 주 는 것 으로 나 타 났 다. Number 에 재 작성 하 는 몇 가지 방법 은 말 할 것 도 없 이 get 방법 을 사용 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.