[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-model-aktorov-i-kak-ona-realizovana-v-java":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":22,"progress":23,"seo":24},305,"chto-takoe-model-aktorov-i-kak-ona-realizovana-v-java",8,"mnogopotochnost","Многопоточность","🔀","Что такое модель акторов и как она реализована в Java?","\u003C!-- grade: 5\u002F5 — глубокий ответ с историей, реализациями и сравнением -->\n\n**Модель акторов (Actor Model)** — это математическая модель параллельных вычислений (Карл Хьюитт, 1973), в которой **актор** является базовой единицей вычислений. Каждый актор:\n\n1. Получает сообщения и обрабатывает их **по одному**\n2. Может создавать новых акторов\n3. Может отправлять сообщения другим акторам\n4. Может изменять своё внутреннее состояние\n\nКлючевая идея: акторы **никогда не разделяют состояние**. Вся коммуникация — через асинхронную передачу сообщений. Это исключает проблемы синхронизации, deadlock и race condition по своей природе.\n\n**Основные принципы:**\n- Каждый актор имеет «почтовый ящик» (mailbox) — очередь входящих сообщений.\n- Сообщения обрабатываются последовательно — внутри актора **не нужна синхронизация**.\n- Отправка сообщений асинхронна и неблокирующая.\n- Акторы идентифицируются по адресу (ActorRef), а не по ссылке на объект.\n\n**Реализации в Java:**\n\n**1. Akka\u002FPekko** — наиболее известная реализация\n\n\u003Cdetails>\n\u003Csummary>Код: актор на Akka\u003C\u002Fsummary>\n\n```java\npublic class GreeterActor extends AbstractActor {\n    private int greetingCount = 0; \u002F\u002F Состояние — безопасно без синхронизации\n\n    @Override\n    public Receive createReceive() {\n        return receiveBuilder()\n            .match(String.class, name -> {\n                greetingCount++;\n                getSender().tell(\"Привет получен!\", getSelf());\n            })\n            .match(GetCount.class, msg -> {\n                getSender().tell(greetingCount, getSelf());\n            })\n            .build();\n    }\n\n    public static Props props() {\n        return Props.create(GreeterActor.class);\n    }\n}\n\n\u002F\u002F Использование\nActorSystem system = ActorSystem.create(\"mySystem\");\nActorRef greeter = system.actorOf(GreeterActor.props(), \"greeter\");\ngreeter.tell(\"Мир\", ActorRef.noSender()); \u002F\u002F fire-and-forget\n```\n\n\u003C\u002Fdetails>\n\n> Примечание: Akka изменил лицензию на BSL в 2022 году. Форк Apache Pekko продолжает развитие под Apache 2.0.\n\n**2. Упрощённая реализация на Virtual Threads:**\n\n\u003Cdetails>\n\u003Csummary>Код: простой актор на BlockingQueue + Virtual Thread\u003C\u002Fsummary>\n\n```java\npublic abstract class SimpleActor {\n    private final BlockingQueue\u003CObject> mailbox = new LinkedBlockingQueue\u003C>();\n    private final Thread thread;\n\n    protected SimpleActor() {\n        this.thread = Thread.ofVirtual().start(() -> {\n            while (!Thread.currentThread().isInterrupted()) {\n                try {\n                    Object message = mailbox.take();\n                    onReceive(message);\n                } catch (InterruptedException e) {\n                    Thread.currentThread().interrupt();\n                }\n            }\n        });\n    }\n\n    protected abstract void onReceive(Object message);\n\n    public void send(Object message) {\n        mailbox.offer(message);\n    }\n\n    public void stop() {\n        thread.interrupt();\n    }\n}\n\n\u002F\u002F Конкретный актор\nclass CounterActor extends SimpleActor {\n    private int count = 0;\n\n    @Override\n    protected void onReceive(Object message) {\n        if (message instanceof String cmd) {\n            switch (cmd) {\n                case \"increment\" -> count++;\n                case \"get\" -> System.out.println(\"Count: \" + count);\n            }\n        }\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n**Сравнение с традиционной многопоточностью:**\n\n| Характеристика | Shared State | Actor Model |\n|---|---|---|\n| Состояние | Общее, защищённое блокировками | Изолированное внутри актора |\n| Коммуникация | Через общую память | Через сообщения |\n| Синхронизация | Явная (synchronized, Lock) | Не нужна |\n| Deadlock | Возможен | Невозможен (нет блокировок) |\n| Масштабирование | Сложно | Естественно |\n\n**Обработка ошибок — принцип «let it crash»:** если актор упал, его супервизор (supervisor) решает: перезапустить актор, эскалировать ошибку или остановить его.\n\n**Частые ошибки:**\n- Передача изменяемых объектов как сообщений — нарушает изоляцию. Сообщения должны быть иммутабельными.\n- Блокирующие вызовы внутри актора (`future.get()`) — блокирует обработку всех сообщений.\n- `Patterns.ask` повсеместно вместо `tell` — снижает производительность.\n\n**Актуальность:** Apache Pekko — основная реализация. Модель акторов используется в IoT, игровых серверах, финансовых системах. С Virtual Threads простые сценарии можно реализовать без тяжёлых фреймворков.\n\n> **Аналогия:** модель акторов — это организация работы через записки. Каждый сотрудник (актор) сидит в своём кабинете (изолированное состояние), получает записки (сообщения) во входящий лоток (mailbox) и обрабатывает их по одной. Никто не заходит к нему в кабинет и не трогает его документы — общение только через записки.\n\n> **На собеседовании** покажите понимание trade-offs: модель акторов устраняет проблемы разделяемого состояния, но усложняет отладку (асинхронные сообщения), тестирование и добавляет накладные расходы на сериализацию. Для Java-проектов без кластерного распределения Virtual Threads + Structured Concurrency часто являются более простой альтернативой.","","senior",[15,16,17,18,19,20,21],"mailbox","акторы","Pekko","сообщения","Actor-Model","Akka","concurrency",[],null,{"title":25,"description":26,"ogTitle":27,"ogDescription":28,"keywords":29,"schemaAnswer":35,"featuredSnippetReady":36},"Модель акторов в Java — Akka\u002FPekko, принципы и реализация — Gymterview","Модель акторов: изолированное состояние, асинхронные сообщения, mailbox. Реализации: Akka\u002FPekko, упрощённая на BlockingQueue + Virtual Threads.","Actor Model в Java — изоляция состояния через сообщения","Акторы не разделяют состояние, общаются через асинхронные сообщения. Нет блокировок, нет deadlock. Реализации: Akka\u002FPekko, Virtual Threads + BlockingQueue.",[30,31,32,17,33,34],"модель акторов Java","Actor Model","Akka Java","акторы многопоточность","mailbox сообщения","Модель акторов (Карл Хьюитт, 1973) — модель параллельных вычислений, где актор: получает и обрабатывает сообщения по одному, создаёт новых акторов, отправляет сообщения, изменяет своё состояние. Акторы никогда не разделяют состояние — вся коммуникация через асинхронные сообщения. Реализации в Java: Akka\u002FApache Pekko (полнофункциональная), упрощённая — на BlockingQueue + Virtual Threads. Обработка ошибок по принципу «let it crash» через супервизоры.",true]