Подтвердить что ты не робот

Как 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 ").

4b9b3361

Ответ 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!");
}