Вопрос

У меня есть несколько вопросов о методе AtomicReference.compareAndSet(), согласно документу, в нем говорилось:

Атомарно устанавливает значение данного обновленного значения, если текущее значение == ожидаемое значение.

Насколько я понимаю, == оператор сравнивает адреса двух объектов, если да, то как это будет работать в подобных примерах

private AtomicReference<AccessStatistics> stats =
    new AtomicReference<AccessStatistics>(new AccessStatistics(0, 0));
public void incrementPageCount(boolean wasError) {
    AccessStatistics prev, newValue;
    do {
        prev = stats.get();
        int noPages = prev.getNoPages() + 1;
        int noErrors = prev.getNoErrors;
        if (wasError) {
           noErrors++;
        }
        newValue = new AccessStatistics(noPages, noErrors);
    } while (!stats.compareAndSet(prev, newValue));
}

В этом фрагменте кода показано, как jvm узнает, какие поля AccessStatistics подлежат сравнению в compareAndSet()?На самом деле мне просто интересно, как работает вся эта стратегия, учитывая, что Java не позволяет переопределять == совсем?Спасибо за любые комментарии!

Это было полезно?

Решение

откуда jvm узнает, какие поля AccessStatistics следует сравнивать в функции CompareAndSet()?

Это не так.Он не сравнивает поля в объекте.Это просто сравнение ссылка объекта, о чем говорится в документации.Вот как AtomicReference класс работает.Как вы упомянули из javaдокументы, оно использует == и не equals() метод.

Атомарно устанавливает значение данного обновленного значения, если текущее значение == ожидаемое значение.

Все Atomic* классы имеют схожие функции.Это позволяет вам атомарно устанавливать значения, будучи уверенным, что другой поток не перезапишет ваше значение.С compareAndSet(...) вам необходимо указать ссылку на текущий объект, чтобы гарантировать, что вы обновляетесь должным образом.

В вашем фрагменте кода он пытается добавить неизменяемый объект статистики доступа.Таким образом, он получает текущее значение, прибавляет к нему, а затем сохраняет новую статистику в ссылку.Если другой поток сохранен его статистика за это время, а затем compareAndSet вернет false, и он зациклится и попытается снова.Это решает условия гонки без необходимости иметь synchronized блокировать.

Другие советы

JVM не сравнивает поля вообще.Это просто сравнивает, является ли это одинаковую ссылку, такой же указатель в памяти, или все, что вы хотите называть это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top