1097. Напишите потокобезопасную реализацию класса с неблокирующим методом BigInteger next(), который возвращает элементы последовательности: [1, 2, 4, 8, 16, ...].
Ниже приведена потокобезопасная реализация класса с неблокирующим методом next(), который возвращает элементы последовательности [1, 2, 4, 8, 16, ...]:
import java.math.BigInteger;
import java.util.concurrent.atomic.AtomicReference;
public class PowerOfTwoSequence {
private AtomicReference<BigInteger> current;
public PowerOfTwoSequence() {
current = new AtomicReference<>(BigInteger.ONE);
}
public BigInteger next() {
while (true) {
BigInteger currentValue = current.get();
BigInteger nextValue = currentValue.multiply(BigInteger.TWO);
if (current.compareAndSet(currentValue, nextValue)) {
return currentValue;
}
}
}
}
В этой реализации используется класс AtomicReference для обеспечения атомарного доступа к текущему значению последовательности. Метод next() выполняет цикл, пока не удастся успешно обновить текущее значение с помощью операции compareAndSet(). Если операция выполнена успешно, то возвращается предыдущее значение последовательности. Таким образом, каждый вызов next() возвращает следующее значение в последовательности [1, 2, 4, 8, 16, ...].
Обратите внимание, что данная реализация гарантирует корректность работы в многопоточной среде без блокировки потоков.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov