В одной из моих программ я пытался обновить значение 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;
}
Я не могу обнаружить каких-либо существенных различий между этими двумя методами.
Почему set()
, когда у нас getAndSet()
. Можно выбрать не использовать значение, возвращаемое getAndSet()
.
Когда следует использовать каждый из этих методов?