Корректно ли отработает AtomicInteger?
В моём случае много потоков читают и записывают в одну переменную с проверкой на значение:
AtomicInteger value = new AtomicInteger(0);
public void threadMethod() {
if (value.get() < 30) {
value.incrementAndGet();
// движения
}
}
public void anotherThreadMethod() {
value.decrementAndGet();
// движения
}
Не может ли возникнуть проблема, что 2 треда одновременно вызовут value.get(), получат 29 и в итоге value будет 31? Если да, то что можно с этим сделать?
Ответы (1 шт):
Автор решения: Roman-Stop RU aggression in UA
→ Ссылка
Используйте compareAndSet чтоб одной атомарной операцией проверить значение и изменить. Если не удалось (значит параллельно другой поток изменил уже значение) - пробуем опять.
public void threadMethod() {
while (True) {
int val = value.get();
if (val >= 30) {
break;
}
if (value.compareAndSet(val, val+1)) {
// удалось атомарно увеличить
break;
}
}
}