(обратите внимание, что этот вопрос касается не CAS, а о "May fail spuriously" Javadoc).
Единственное различие в Javadoc между этими двумя методами из класса AtomicInteger
заключается в том, что в файле weakCompareAndSet есть комментарий: "Может произойти с ошибкой".
Теперь, если мои глаза не будут обмануты каким-то заклинанием, оба метода выглядят одинаково:
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
/* ...
* May fail spuriously.
*/
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
Итак, я понимаю, что "May" не означает "Must", но почему бы нам не начать добавлять это в нашу кодовую базу:
public void doIt() {
a();
}
/**
* May fail spuriously
*/
public void weakDoIt() {
a();
}
Я действительно путаюсь с этим weakCompareAndSet(), который, похоже, выполняет то же самое, что и compareAndSet(), но "может ошибочно ошибочно", а другой не может.
По-видимому, "слабый" и "ложный провал" каким-то образом связаны с заказом "бывает раньше", но я все еще очень смущен этими двумя методами AtomicInteger (и AtomicLong и т.д.): , потому что, по-видимому, они называют точно такой же метод unsafe.compareAndSwapInt.
Я особенно смущен тем, что AtomicInteger
появился в Java 1.5, поэтому после изменения модели памяти Java (так что это явно не то, что может "провалиться ложно в 1.4", но чье поведение изменилось на "не подведет" ложно в 1,5 ").