Реентерабельность акторов: баг check → await → mutate 🐛
🐛 Акторы сериализуют доступ, но они реентерабельны. Пока метод висит на await, на том же акторе успевает выполниться другой — и всё, что вы проверили до await, может стать неправдой. Классика жанра: проверили баланс → await на списание → уменьшили баланс. Между проверкой и мутацией состояние уже успело поменяться.
✅ Что делать: мутировать состояние в синхронном коде, резервировать (списывать) до await, а после возобновления перепроверять предположения. Критическая секция должна быть короткой и без точек приостановки.
💡 Важно не путать: реентерабельность — это не конкурентность. Два метода никогда не выполняются на акторе одновременно, они чередуются (interleaving). Нереентерабельные акторы до сих пор живут только в разделе Future Directions в SE-0306.