Ответ
Actor обеспечивает потокобезопасность через изоляцию состояния и сериализацию доступа. Каждый actor имеет внутреннюю очередь (mailbox), и доступ к его изменяемому состоянию возможен только через асинхронные вызовы (await). Компилятор гарантирует, что в один момент времени выполняется только одна задача, изменяющая состояние actor, предотвращая race conditions.
Пример actor:
actor Counter {
private var value = 0
func increment() {
value += 1
}
func getValue() -> Int {
return value
}
}
// Использование
let counter = Counter()
Task {
await counter.increment()
print(await counter.getValue()) // Гарантированно 1
}
Ключевые механизмы:
- Изоляция: Свойства и методы actor изолированы по умолчанию.
- Сериализация: Вызовы методов, изменяющих состояние, ставятся в очередь.
awaitобязателен: Любой доступ к actor извне требуетawait, что явно указывает на потенциальную приостановку.- Не блокирующий: В отличие от locks, actor использует кооперативную модель async/await, что эффективнее для конкурентности.