>source

내 프로그램 중 하나에서 Atomic Integer의 값을 업데이트하려고했지만 set() 를 결정할 수 없었습니다.  그리고 getAndSet()  두 가지가 모두 같은 것처럼 보이기 때문에 이미 이 와 이 게시물이지만 set 를 비교하고 있습니다  그리고 compareAndSet (스레드에 예상 값이 없으면 제공된 값 설정을 포기합니다) 반면 set 를 비교하고 싶습니다.   setAndGet 와 함께 (제공된 값을 설정 한 후에 만 ​​반환).

  //Sets the newValue to the volatile member value
    public final void set(int newValue) {
       value = newValue;
   }

그리고

  public final int getAndSet(int newValue) {
       return unsafe.getAndSetInt(this, valueOffset, newValue);
   }
    //Doesn't give up until it sets the updated value. So eventually overwrites  the latest value.
    public final int getAndSetInt(Object paramObject, long paramLong, int paramInt) {
    int i;
    do {
        i = getIntVolatile(paramObject, paramLong);
    } while (!compareAndSwapInt(paramObject, paramLong, i, paramInt));
    return i;
}

두 방법의 주요 차이점을 찾을 수 없습니다.

  1. 왜 와이즈 비츠  우리가 set() 때 . getAndSet() 가 반환 한 값을 사용하지 않도록 선택할 수 있습니다 .

  2. 언제나 이러한 방법을 각각 사용해야합니까?

getAndSet()

  • 답변 # 1

    자바 문서에 따르면 둘 다 다른 일을한다 :

    AtomicReference#getAndSet  내부 값을 전달한 값으로 설정하지만 이전 값을 반환합니다.

    AtomicReference<Integer> reference = new AtomicReference<>(10);
    int value = reference.getAndSet(14);
    System.out.println(value); // prints 10
    
    

    AtomicReference#set  내부 가치를 설정합니다. void를 반환합니다.

    AtomicReference<Integer> reference = new AtomicReference<>(10);
    reference.set(15);
    System.out.println(reference.get()); // prints 15;
    
    

관련 자료

  • 이전 project reactor - spring webflux - 요청에서 모노 또는 플럭스 소비
  • 다음 Google 액션 및 대화 흐름 에이전트 란 무엇입니까?