Сравнить - PullRequest
       16

Сравнить

2 голосов
/ 21 мая 2011

Прохождение курса по параллельному программированию.

В качестве примера у нас есть

final class Counter {

        private AtomicInteger value;

        public long getValue() {
            return value.get();
        }

        public long increment() {
            int v;
            do {
                v = value.get();
            }
            while(!value.compareAndSet(v, v+1));
            return v+1;
        }
}

Почему бы вам использовать сравнениеAndSet в этом случае, а не incrementAndGet?

Спасибо

Ответы [ 4 ]

4 голосов
/ 21 мая 2011

Вот реализация метода AtomicInteger.incrementAndGet() из версии JDK, которую я имею на моей машине:

/**
 * Atomically increments by one the current value.
 *
 * @return the updated value
 */
public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

Как видите, реализация очень похожа на вашу.

PS: Почему вы вычисляете v+1 дважды?

2 голосов
/ 21 мая 2011

Из документов Java,

Сравнить и установить:

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

public final boolean compareAndSet(V expect,
                                   V update)

incrementAndGet:

атомно увеличивается на единицу текущее значение.

public final int incrementAndGet()
1 голос
/ 21 мая 2011

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

0 голосов
/ 26 июня 2012

В вашем случае счетчик классов реализует приращение значения по-своему, а JDK AtomicInteger.incrementAndGet() также реализует его по-своему. Но они также используют метод CAS compareAndSet(V expect ,V newValue).
Таким образом, эти два вида реализации не имеют никакой разницы. Незначительное различие между этими двумя способами - форма обращения. Кстати, ответь для вычисления v + 1 дважды.

while(!value.compareAndSet(v, v+1));----v+1 is the parameter for function , and realize value to add 1;
        return v+1;  v+1 is the return value;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...