Атомная переменная Java set() против compareAndSet()

Я хочу знать разницу между set() и compareAndSet() в атомарных классах. Обеспечивает ли метод set() атомарный процесс? Например, этот код:

public class sampleAtomic{
    private static AtomicLong id = new AtomicLong(0);

    public void setWithSet(long newValue){
        id.set(newValue);
    }

    public void setWithCompareAndSet(long newValue){
        long oldVal;
        do{
            oldVal = id.get();
        }
        while(!id.compareAndGet(oldVal,newValue)
    }
}

Эти два метода идентичны?


person Chrisma Andhika    schedule 08.10.2013    source источник


Ответы (2)


Методы set и compareAndSet действуют по-разному:

  • compareAndSet : атомарно устанавливает значение в заданное обновленное значение, если текущее значение равно (==) ожидаемому значению.
  • set : устанавливает заданное значение.

Обеспечивает ли метод set() атомарный процесс?

да. Это атомарно. Потому что есть только одна операция, связанная с set новым значением. Ниже приведен исходный код метода set:

public final void set(long newValue) {
        value = newValue;
}
person Debojit Saikia    schedule 08.10.2013
comment
Спасибо за Ваш ответ. Я забыл проверить исходный код. Вы правы, говоря, что метод set является атомарным, но причина не в том, что он имеет только одну операцию. В автоматических классах есть переменная-член с именем value, и эта переменная является изменчивой (та, что в теле метода set выше), поэтому метод set должен быть потокобезопасным. - person Chrisma Andhika; 08.10.2013
comment
Вы уверены, что классы Atomic являются атомарными, потому что они используют volatile переменные для поддержания своих внутренних состояний. Если вы определяете изменчивую переменную volatile long value, будет ли такая операция, как value++, атомарной? И ответ нет. Эта операция не является атомарной; на самом деле это три разные операции: выборка значения, добавление к нему единицы, запись обновленного значения обратно. Тем временем другой поток может изменить value. Таким образом, наличие переменной volatile не гарантирует атомарности. Операции/процессу присваивается статус atomic, если они обеспечивают поддержку атомарных обновлений. - person Debojit Saikia; 08.10.2013
comment
Теперь операция set является атомарной, потому что она имеет только одну операцию: value = newValue; и является атомарной, даже если value не была определена volatile. Здесь value было определено volatile для использования предоставляемой ими гарантии видимости — изменения, сделанные одним потоком, всегда видны другим потокам. - person Debojit Saikia; 08.10.2013

Как видно из открытого кода jdk ниже.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.set%28long%29

set просто присваивает значение, а compareAndSet выполняет дополнительные операции для обеспечения атомарности.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.compareAndSet%28long%2Clong%29

Возвращаемое значение (логическое) необходимо учитывать при разработке любых атомарных операций.

person Gireesh    schedule 08.10.2013