ложно: без видимой причины
Согласно atomic
пакет Javadoc:
Атомарные классы также поддерживают метод weakCompareAndSet, который имеет ограниченную применимость.
На некоторых платформах слабая версия может быть более эффективной, чем compareAndSet в обычном случае, но отличается тем, что любой заданный вызов метода weakCompareAndSet может возвращать ложно (то есть без видимой причины ).
Ложный возврат означает только то, что операция может быть повторена при желании, полагаясь на гарантию того, что повторный вызов, когда переменная содержит Ожидаемое значение и никакой другой поток также не пытается установить переменную, в конечном итоге завершится успешно.
(Такие ложные сбои могут, например, быть вызваны эффектами нехватки памяти, которые не связаны с тем, равны ли ожидаемые и текущие значения.)
Кроме того, weakCompareAndSet не предоставляет гарантий упорядочения, которые обычно необходимы для управления синхронизацией.
Согласно этого потока , это не столько из-за "аппаратного обеспечения / ОС", сколько из-за алгоритма, используемого параметром weakCompareAndSet:
weakCompareAndSet атомарно устанавливает значение для данного обновленного значения, если текущее значение == ожидаемое значение . Может неуспешно провалиться.
В отличие от compareAndSet () и других операций в AtomicX, операция weakCompareAndSet () не создает никаких упорядочиваний до 10 * *.
Таким образом, тот факт, что поток видит обновление AtomicX, вызванное weakCompareAndSet, не означает, что он должным образом синхронизирован с операциями, которые произошли до уязвимости уязвимого узла ().
Вы, вероятно, не хотите использовать этот метод, но вместо этого следует просто использовать compareAndSet; поскольку есть несколько случаев, когда weakCompareAndSet работает быстрее, чем CompareAndSet, и в ряде случаев попытка оптимизировать код с помощью weakCompareAndSet, а не CompareAndSet привнесет в ваш код тонкие и трудные для воспроизведения ошибки синхронизации.
Примечание относительно заказов до и до :
Модель памяти Java (JMM) определяет условия, при которых поток, читающий переменную, гарантированно увидит результаты записи в другом потоке.
JMM определяет порядок операций программы, называемой случайным образом.
Упорядочения случайности перед потоками создаются только путем синхронизации по общей блокировке или доступа к общей изменчивой переменной.
В отсутствие порядка «происходит до» у платформы Java есть широкие возможности для отсрочки или изменения порядка, в котором записи в одном потоке становятся видимыми для чтения той же переменной в другом.