Итерация и добавление внутри цикла в Java 8 [dубликат]

Например, если я буду запускать этот код из нескольких потоков и каждого потока много раз, будет ли потенциальная гонка данных?

   public boolean swap(int i, int j) {
    if (value.get(i) <= 0 || value.get(j) >= maxval) {
        return false;
    }
    value.decrementAndGet(i);
    value.incrementAndGet(j);
    return true;
}

Кстати, есть ли разница, если я использую декремент AndGet или getAndDecrement здесь? Значение

здесь - AtomicIntegerArray. Мне нужно выполнить тест производительности между различными методами синхронизации. Таким образом, я поменяю элементы в ценности и посмотрю, равна ли сумма вывода ожидаемой

. Моя задача - найти метод, который «не должен быть DRF», но «все равно должен быть без взаимоблокировки», и также намного быстрее, чем ReentrantLock. Поэтому я беспокоюсь о поиске метода, который имеет гонку данных ...

1
задан 12 May 2014 в 02:35

2 ответа

Как написано выше, все методы AtomicInteger являются потокобезопасными.

будет потенциально гонка данных

Технически да, будет гонка данных, потому что

Вы дважды вызываете get при оценке логического выражения; Выражение «AtomicInteger является потокобезопасным» означает, что каждый поток, вызывающий, например, value.decrementAndGet(i) (и все другие методы на основе CAS), в конечном итоге завершит эту операцию успешно. Никаких других гарантий.

Использование потокобезопасного класса недостаточно для предотвращения гонок данных. Также я хотел бы упомянуть, что гонка данных не всегда плохая вещь, иногда она приемлема на самом деле.

1
ответ дан 15 August 2018 в 15:49
[D0] Да; все методы в классах Atomic* являются потокобезопасными.

Различие между decrementAndGet() и getAndDecrement() - это какое значение оно возвращает.

1
ответ дан 15 August 2018 в 15:49
  • 1
    Методы Atomic* являются потокобезопасными, но использование OP их не является. Я думаю, что последнего попросили (несмотря на название), но даже если бы не было небрежно не упоминать об этом. – user 12 May 2014 в 02:23
  • 2
    Какая часть не компилируется? Обратите внимание на редактирование; value - AtomicIntegerArray, а не один AtomicInteger. – user 12 May 2014 в 02:26

Другие вопросы по тегам:

Похожие вопросы: