Найти в Дзене
DEBAGanov

Java 1097. Напишите потокобезопасную реализацию класса с неблокирующим методом BigInteger next(), который возвращает элементы последовательн

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