Как smsShareCompareAndSet может ошибочно, если он реализован точно так же, как compareAndSet?
(обратите внимание, что этот вопрос касается не 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 ").
Ответы
Ответ 1
Существует разница между реализацией и спецификацией...
В то время как на конкретной реализации может не быть особого смысла в предоставлении различных реализаций, возможно, захотят будущие реализации, возможно, на другом оборудовании. Является ли этот метод весом в API, является спорным.
Также методы weak
не выполняются - до того, как будет определен порядок. Версии не weak
ведут себя как поля volatile
.
Ответ 2
Просто, чтобы немного поиграть, если ваш вопрос был
Как может слабое отклонение ложно, если оно реализовано точно так же, как doIt?
вот ответ!
public void doIt() {
a();
}
/**
* May fail spuriously
*/
public void weakDoIt() {
a();
}
void a(){
if(Thread.currentThread().getStackTrace()[2].toString().contains("weakDoIt"))
System.out.println("I will fail spuriously!");
else System.out.println("I won't fail spuriously!");
}