Сравнение и своп являются атомарными на уровне ЦП.
Вы можете явно выполнить операцию инкремента с помощью сравнения и свопинга:
int value = var.get();
while (!var.compareAndSwap(value, value + 1)) {
value = var.get();
}
ЦП гарантирует compareAndSwap
быть атомарным (будет собственная реализация этого).
Если два потока ударили по этому compareAndSwap
одновременно, только один из них "победит", получив true
в результатеcompareAndSwap
вызов, так что цикл останавливается.
Другой поток «проиграет» и получит false
в результате, и поэтому снова обойдет цикл: он читает новое значение, а затемпробует CAS снова.Если это удается (потому что либо другой поток не пытался сделать это одновременно, либо он «выиграл» над другим потоком), цикл останавливается;в противном случае он просто пытается снова.