Класс Unsafe
не так хорошо документирован, как классы, публично предоставляемые JDK, поэтому не все гарантии, которые его методы дают, очевидны.
Однако, если вы посмотрите на последний исходный код AbstractQueuedSynchronizer
, вы увидите, что теперь он использует VarHandle
, методы которого хорошо документированы.Для compareAndSet
документация говорит :
Атомно устанавливает значение переменной в newValue с семантикой памяти setVolatile (java.lang.Object ...), еслитекущее значение переменной, называемое значением свидетеля, == Ожидаемое значение, к которому обращается семантика памяти getVolatile (java.lang.Object ...).
Это означает, что не будетбыть в состоянии гонки, поскольку для двух параллельных потоков только один поток обновит значение, а другой потерпит неудачу.И вы получите необходимые гарантии видимости памяти.