Разница между методами Atomic set () и getAndSet () в Java - PullRequest
2 голосов
/ 24 апреля 2019

В одной из моих программ я пытался обновить значение 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(). Можно выбрать не использовать значение, возвращаемое getAndSet().

  2. Когда следует использовать каждый из этих методов?

1 Ответ

1 голос
/ 24 апреля 2019

Согласно документации Java , они оба делают разные вещи:

AtomicReference#getAndSet установит внутреннее значение на то, что вы передадите, но вернет старое значение.

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

AtomicReference#set установит внутреннее значение, и все. Возвращает пустоту.

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