2015-09-30 2 views
3

Как я могу сравнить AtomicInteger с заданным значением int без установки AtomicInteger на новое значение? Я не вижу такого метода в AtomicInteger.сравнить AtomicInteger без его настройки

+5

Что случилось с 'get()'? – biziclop

+0

@biziclop Ну, это то, что я сейчас использую, но я думал, что к моменту возвращения 'get()' значение в AtomicInteger может обновиться до нового значения ... так что я могу получить устаревшее значение? –

+0

@ peter.petrov Это сравнение может быть синхронизировано? –

ответ

4

по времени получим() возвращает значение в AtomicInteger может получить обновление до нового значения ... так что я могу получить несвежий значение

По определению, если значение в атомное целое будет обновляться сразу после того, как вы вызовете int i = atomic.get(), у вас будет устаревшее значение в i. Но именно так работают параллельные программы - когда вы проконсультируетесь со значением, вы знаете, что он уже может быть изменен.

Гарантия AtomicInteger::get заключается в том, что при его вызове вы получите самое последнее значение, доступное во время разговора. Гарантия, которой у вас не было бы с простым int, например.


Другими словами, представьте себе программу ниже:

if (atomic.get() == 0) print("zero"); 

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

Если вам нужно убедиться, что печать вызывается только в том случае, если значение по-прежнему равно 0, вам необходимо синхронизировать (или использовать блокировку) весь блок.

+0

Хм, значит, мне лучше синхронизировать все это? Я хочу сделать атомное сравнение, которое гарантирует, что значение не изменится, пока я сравниваю. Это все. –

+0

@ peter.petrov см. Мое редактирование. – assylias

+0

Хм, хорошо, хорошо ... Я немного разочарован :), поскольку я как-то ожидал чего-то еще ... но спасибо. –

3

get() У вас есть способ это

Получает текущее значение.

Returns: 
the current value 

Вам не нужно беспокоиться о том, что синхронной части, так как вы сравните, что в определенный момент.

+0

Ну, я понимаю, что вы имеете в виду, но ... Я думаю, это не так просто. Почему эти методы сравнения в AtomicInteger, если мы все должны использовать get()? –

+0

Хм, хорошо, хорошо ... Я немного разочарован :), поскольку я как-то ожидал чего-то еще ... но спасибо. –

Смежные вопросы