Mutex: замок, который больше не нужно писать руками ✅
🔒 Mutex — примитив взаимного исключения из стандартной библиотеки, который владеет защищаемым значением. import Synchronization, хранить в let — и всё.
⚠️ Первое: это Swift 6.0 (SE-0433), а не 5.9. Доступность — macOS 15, iOS 18, watchOS 11, visionOS 2, плюс Linux и Windows.
⚠️ Второе, что почти всегда пишут лишним: @unchecked Sendable здесь не нужен. Mutex конформит Sendableбезусловно, так что final class, у которого единственное хранимое свойство — let Mutex<Int>, конформит обычному Sendable сам. Три вещи, о которых стоит знать. Mutex обязан быть let, никогда var — он помечен @_staticExclusiveOnly, чтобы не тащить динамическую проверку эксклюзивности. Тело withLock не асинхронное, поэтому await внутри — ошибка компиляции, а не рантайм-ловушка; именно поэтому в API вообще нет голых lock()/unlock(): точка приостановки могла бы возобновиться на другом потоке. И он не рекурсивный: вложенный withLock — поведение, зависящее от платформы (паника, дедлок или неопределённость), повторного захвата не будет никогда.
💡 Порядок выбора: для большинства кода приложения актор лучше — он безопаснее и проще. Mutex берут, когда нужен точный контроль или актор оказывается слишком крупной гранулой.
#Swift #SwiftConcurrency #ThreadSafety #Mutex #iOSDevelopment