Корректно ли отработает 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;
       }
    }
}
→ Ссылка