unsafe.compareAndSwapInt первый аргумент menanig
Я расследую java.util.concurrent.locks.AbstractQueuedSynchronizer
исходный код.
Из нескольких мест вызывает compareAndSetState
метод.
/**
* Atomically sets synchronization state to the given updated
* value if the current state value equals the expected value.
* This operation has memory semantics of a {@code volatile} read
* and write.
*
* @param expect the expected value
* @param update the new value
* @return {@code true} if successful. False return indicates that the actual
* value was not equal to the expected value.
*/
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
параметры expect
а также update
очевидны и соответствуют параметрам атомности. Но this
это объект (а не int
).
Как это соотносится с ожидаемым?
1 ответ
Это тот случай, чье поле state
будет CAS-ред. Значение сохраняется в этом поле. Пара экземпляр-смещение - это способ преобразования дескриптора поля в адрес памяти, точно так же, как вы должны указать экземпляр при использовании Field::set
, Field::get
или же Method::invoke
,
Кстати, источник этих классов Солнца доступен онлайн в ртутном репозитории openjdk.