Традиционно изменяемое состояние приходилось защищать вручную с помощью тщательной синхронизации во время выполнения. Используя такие инструменты, как блокировки и очереди, предотвращение гонок данных полностью зависело от программиста. Это, как известно, сложно не только сделать правильно, но и поддерживать правильность с течением времени. Даже определение необходимости синхронизации может быть сложным.
Хуже всего то, что небезопасный код не гарантирует сбой во время выполнения. Этот код часто может казаться работающим, возможно, потому, что для проявления некорректного и непредсказуемого поведения, характерного для гонки данных, требуются крайне необычные условия.
Более формально, гонка данных происходит, когда один поток обращается к памяти, в то время как та же память мутируется другим потоком. Режим языка Swift 6 устраняет эти проблемы, предотвращая гонки данных во время компиляции.
Система Swift concurrency позволяет компилятору понимать и проверять безопасность всех изменяемых состояний. Он делает это с помощью механизма, называемого изоляцией isolation данных. Изоляция данных гарантирует взаимоисключающий доступ к изменяемым состояниям. Это форма синхронизации, концептуально похожая на блокировку. Но в отличие от блокировки, защита, которую обеспечивает изоляция данных, происходит во время компиляции.
Это не простая тема и ей посвящены несколько замечательных статей, которые переведены на русский язык и размещены на этом сайте:
Подводные камни Swift Actor: понимание и управление Reentrancy.
Это перевод статьи The Swift Actor Pitfall: Understanding and Managing Reentrancy.
Многопоточность по шагам: Сетевой запрос.
Это перевод статьи Concurrency Step-by-Step: A Network Request
Многопоточность по шагам: Чтение из хранилища.
Это перевод статьи Concurrency Step-by-Step: Reading from Storage
Многопоточность по шагам: системы с изменяемым состоянием.
Это перевод статьи Concurrency Step-by-Step: Stateful Systems