Цикл может быть бесконечным (так как он может вызвать голодание для вашего потока), но вероятность этого события очень мала. Для того, чтобы вы могли голодать, вам нужен какой-то другой поток, преуспевающий в изменении значения, которое вы хотите обновить между чтением и вашим хранилищем, и чтобы это происходило неоднократно.
Можно было бы написать код для запуска голодания, но для реальных программ это вряд ли произойдет.
Сравнение и своп обычно используются, когда вы не думаете, что у вас будут конфликты записи очень часто. Допустим, при обновлении существует 50% -ная вероятность «промаха», тогда 25% -ная вероятность того, что вы пропустите два цикла, и менее 0,1% вероятности того, что ни одно обновление не будет выполнено в 10 циклах. Для примеров из реальной жизни 50% -ый процент пропусков очень высок (в основном, ничего не делая, кроме обновления), и, поскольку процент пропусков уменьшается, скажем, 1%, тогда риск неуспеха в двух попытках составляет всего 0,01% и в пытается 0,0001%.
Использование похоже на следующую проблему
Установите переменную a равной 0, и два потока обновят ее с a = a + 1 миллион раз каждый одновременно. В конце можно получить любой ответ между 1000000 (каждое другое обновление было потеряно из-за перезаписи) и 2000000 (обновление не было перезаписано).
Чем ближе к 2000000, тем выше вероятность того, что использование CAS будет работать, поскольку это означает, что довольно часто CAS будет видеть ожидаемое значение и сможет устанавливать новое значение.