Когда использовать AtomicReference (Java)? Это действительно необходимо? - PullRequest
6 голосов
/ 29 мая 2010

Я использовал AtomicLong много раз, но мне никогда не приходилось использовать AtomicReference

Похоже, что AtomicReference тоже (я скопировал этот код из другого стекового потока вопрос):

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue) {
        // someList could be changed by another thread after that compare,
        // and before this set
        this.someList = newValue;
        return true;
    }
    return false;
}

или

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue || this.someList.equals(oldValue)) {
        // someList could be changed by another thread after that compare,
        // and before this set
        this.someList = newValue;
        return true;
    }
    return false;
}

Предположим, этот.someList помечен как изменчивый.

Я не совсем уверен, какой именно, потому что javadoc и код для этого класса не ясны, если используется .equals.

Видя, что вышеприведенные методы не так уж сложно написать, кто-нибудь когда-либо использовал AtomicReference?

1 Ответ

11 голосов
/ 29 мая 2010

Это ссылка , так что это то, что сравнивается. Документация очень ясно показывает, что это сравнение идентичности, даже с использованием операции == в ее описании.

Я очень часто использую AtomicReference и другие атомарные классы. Профилирование показывает, что они работают лучше, чем эквивалентные методы, использующие синхронизацию. Например, операция get() на AtomicReference требует только выборки из основной памяти, тогда как аналогичная операция с использованием synchronized должна сначала сбросить все значения, кэшированные потоками, в основную память, а затем выполнить ее выборку.

Классы AtomicXXX предоставляют доступ к встроенной поддержке операций сравнения и замены (CAS). Если базовая система его поддерживает, CAS будет работать быстрее, чем любая схема, созданная с использованием блоков synchronized в чистой Java.

...