(обратите внимание, что этот вопрос не о CAS, это о, "Может привести к сбою побочно" 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);
}
Таким образом, я понимаю это, май не означает, "Должен", но затем почему не делают все мы начинаем добавлять это к нашей кодовой базе:
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").
Существует разница между реализацией и спецификацией...
В то время как в конкретной реализации может не быть особого смысла в предоставлении различных реализаций, будущие реализации, возможно, на другом оборудовании, могут захотеть этого. Имеет ли этот метод вес в API - вопрос спорный.
Также слабые
методы не имеют определенного happens-before упорядочивания. Неслабые
версии ведут себя как volatile
поля.