Я пытаюсь понять, как обновляется в getAndIncrement, вот этот фрагмент кода.Java AtomicInteger getAndIncrement() и compareAndSet
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
Я понимаю, что compareAndSet Сравнит ли такое же, как значение, хранящееся в регистре текущего значения, если это то же самое, то измените значение в регистре с другой.
Часть, которую я не понимаю, это то, почему она не возвращает next
вместо current
.
При вводе цикла current
задается как int, а current
не является опорным значением, поэтому если ток инициализирован как 5, то когда он возвращает ток, должно ли оно быть равно 5? Или, когда он вернется current
, current
снова вызовет get()
, чтобы получить обновленное значение из регистра?
потому что вы вызываете ['getAndIncrement()'] (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html#getAndIncrement--), который несколько напоминает оператор postincrement ('i ++'). Для описанного поведения существует ['incrementAndGet()'] (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html#incrementAndGet--) , который напоминает оператор preincrement ('++ i'). – Turing85
Что я спрашиваю, так как «текущий» обновляется как примитив, я вижу только то, что обновляется значение «current»? –
Я не совсем понимаю ваш комментарий. Java имеет значение pass-by-value, поэтому 'current' никогда не будет изменен и, таким образом, в вашем примере' 5' будет возвращен. Отвечает ли это на ваш вопрос? – Turing85