2015-04-14 4 views
6

Как обновить AtomicInteger, если его текущее значение меньше заданного значения? Идея такова:Как обновить Atomic на основе условия?

AtomicInteger ai = new AtomicInteger(0); 
... 
ai.update(threadInt); // this call happens concurrently 
... 
// inside AtomicInteger atomic operation 
synchronized { 
    if (ai.currentvalue < threadInt) 
     ai.currentvalue = threadInt; 
} 
+0

пожалуйста вставьте рабочий код то есть без каких-либо ошибок компиляции .. – SMA

+0

Опубликованная код фрагмент не имеет смысла. Сначала вы обновляете 'ai' (что бы вы ни говорили с .update()) и после проверки значения с новым. – SubOptimal

+1

Это хороший вопрос, и это имеет смысл. Для критики: OP не может написать рабочий код для этого. Если бы он это сделал, ему нужно было бы знать ответ, поэтому он мог бы публиковать псевдокод. –

ответ

11

Если вы используете Java-вы можете использовать один из новых методов обновления в AtomicInteger, которые можно передать лямбда-выражение. Например:

AtomicInteger ai = new AtomicInteger(0); 

int threadInt = ... 

// Update ai atomically, but only if the current value is less than threadInt 
ai.updateAndGet(value -> value < threadInt ? threadInt : value); 
4

Если у вас нет Java 8, вы можете использовать CAS-цикл вроде этого:

while (true) { 
    int currentValue = ai.get(); 
    if (newValue > currentValue) { 
     if (ai.compareAndSet(currentValue, newValue)) { 
      break; 
     } 
    } 
}