[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-napishite-potokobezopasnuyu-realizatsiyu-klassa-s-neblokiruyushchim-metodom-biginteger-next-kotoryy-vozvrashchaet-elementy-posledovatelnosti-1-2-4-8-16":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},290,"napishite-potokobezopasnuyu-realizatsiyu-klassa-s-neblokiruyushchim-metodom-biginteger-next-kotoryy-vozvrashchaet-elementy-posledovatelnosti-1-2-4-8-16",8,"mnogopotochnost","Многопоточность","🔀","Напишите потокобезопасную реализацию класса с неблокирующим методом BigInteger next(), который возвращает элементы последовательности: [1, 2, 4, 8, 16, ...]","\u003C!-- grade: 5\u002F5 — компактная и корректная lock-free реализация -->\n\nЗадача: каждый вызов `next()` должен возвращать следующую степень двойки. Реализация через CAS-цикл с `AtomicReference\u003CBigInteger>`.\n\n\u003Cdetails>\n\u003Csummary>Код: потокобезопасный генератор степеней двойки\u003C\u002Fsummary>\n\n```java\nclass PowerOfTwo {\n    private AtomicReference\u003CBigInteger> current = new AtomicReference\u003C>(null);\n\n    BigInteger next() {\n        BigInteger recent, next;\n        do {\n            recent = current.get();\n            next = (recent == null)\n                ? BigInteger.valueOf(1)         \u002F\u002F Первый вызов → 1 (2^0)\n                : recent.shiftLeft(1);          \u002F\u002F Сдвиг влево = умножение на 2\n        } while (!current.compareAndSet(recent, next));\n        return next;\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n**Как это работает:**\n1. Поток читает текущее значение.\n2. Вычисляет следующее (сдвиг влево на 1 бит = умножение на 2).\n3. Атомарно пытается обновить значение через CAS.\n4. Если другой поток успел обновить — CAS вернёт `false`, цикл повторится с новым значением.\n\n**Гарантии:** каждое значение последовательности будет возвращено ровно одному потоку, без пропусков и дублирований. `BigInteger` — неизменяемый, поэтому `shiftLeft` создаёт новый объект, не модифицируя старый.\n\n> **На собеседовании** это задание проверяет умение применять CAS-цикл для реальной задачи. Обратите внимание на использование `BigInteger` вместо `long` — последовательность быстро превысит `Long.MAX_VALUE`.","","senior",[15,16,17,18,19],"CAS","lock-free","BigInteger","AtomicReference","concurrency",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":33,"featuredSnippetReady":34},"Потокобезопасный генератор степеней двойки на AtomicReference — Gymterview","Lock-free реализация генератора последовательности [1, 2, 4, 8, 16, ...] через AtomicReference и CAS-цикл с BigInteger.shiftLeft(1).","Lock-free генератор степеней двойки в Java","AtomicReference хранит текущее значение BigInteger. Метод next() в CAS-цикле сдвигает значение влево (shiftLeft) для получения следующей степени двойки.",[28,29,30,31,32],"AtomicReference BigInteger","потокобезопасный генератор","CAS цикл Java","lock-free последовательность","степени двойки","Реализация использует AtomicReference\u003CBigInteger> и CAS-цикл: метод next() читает текущее значение, вычисляет следующее через shiftLeft(1) и пытается атомарно заменить. Если другой поток изменил значение — операция повторяется. Начальное значение null, первый вызов возвращает BigInteger.valueOf(1).",true]