Метод compareAndSwap()
будет выполнять следующие операции атомарно:
- determine if `value` is equal to `v`
- if so, it will set `value` to `v+1`
- it returns whatever `value` was when the method was entered (whether or not `value` was updated)
Вызывающий может проверить, было ли value
ожидаемым, когда он вызвал compareAndSwap()
. Если это так, то вызывающая сторона знает, что она обновлена. Если это не то, что ожидалось, вызывающая сторона знает, что она не была обновлена, и попытается снова, используя «новое» текущее значение value
в качестве ожидаемого (это то, что делает цикл).
Таким образом, вызывающая сторона может знать, что операция приращения не теряется другим потоком, который пытается изменить value
в тот же момент.