Быстрый ответ, не потокобезопасен. Тест и набор должны быть атомарными, если только вы не синхронизируете весь метод. Обратите внимание, что val.get () и тест v не являются атомарными. Если поток уступает после v = val.get (), вы получите два вызова с одинаковым порядковым номером.
Кроме того, в случае сбоя compareAndSet вы никогда не измените значения, это будет бесконечный цикл.
AtomicInteger имеет
getAndIncrement ()
вызов. Это вернет вам чистую стоимость.
Катиться немного сложнее. Одним из решений является изменение возвращаемого значения. Примерно так:
int v = val.getAndIncrement();
return (v % 60) + 1;
Поскольку у каждого потока есть локальная копия v, мы можем безопасно выполнить некоторые математические операции и вернуть значение. Есть одно препятствие, если вы получаете переполнение. В зависимости от того, как часто вы генерируете порядковый номер, это может или не может быть проблемой.