В Swift нет встроенного ключевого слова atomic, в отличие от Objective-C, где свойства по умолчанию являются atomic. Понимание этого различия по-прежнему важно при работе с конкурентным кодом.
@property)Даже atomic-свойства не гарантируют полную потокобезопасность для составных операций. Например:
// Если Thread A и Thread B вызывают это одновременно, это всё ещё небезопасно
// даже если бы `value` был atomic
value = value + 1
Чтение и запись по отдельности безопасны, но составная операция — нет.
Поскольку в Swift нет встроенного atomic-модификатора, нужно явно управлять потокобезопасностью с помощью:
DispatchQueue с последовательной очередью или barrierNSLock / NSRecursiveLockactor-типов (появились в Swift 5.5 для безопасного конкурентного доступа)| Тип свойства | Потокобезопасность | Производительность |
|---|---|---|
atomic | Только отдельные операции | Медленнее |
non-atomic | Нет | Быстрее |
В Swift предпочитай акторы или dispatch queues для надёжной, идиоматичной потокобезопасности вместо того, чтобы полагаться исключительно на atomic-гарантии.
Swift предоставляет встроенное ключевое слово atomic для свойств, делая их потокобезопасными по умолчанию, как в Objective-C.
Новый — ещё не проверен сообществом
Вы