Ответ
Actor — это тип данных, введенный в Swift для безопасной работы с изменяемым состоянием в конкурентном (многопоточном) коде. Он решает проблему гонок данных (data races).
Ключевой принцип: Actor изолирует свое изменяемое состояние, гарантируя, что только одна задача может получить к нему доступ в любой момент времени (взаимное исключение).
Основные особенности:
- Изоляция состояния: Все свойства и методы по умолчанию изолированы.
awaitдля доступа: Для вызова асинхронного метода или доступа к свойству actor'а извне необходимо использоватьawait. Это точка приостановки, где система решает, можно ли войти в actor.- Поддержка
Sendable: Actor сам по себе являетсяSendable, что позволяет безопасно передавать его между потоками.
Пример: BankAccount Actor
actor BankAccount {
private var balance: Double = 0
func deposit(amount: Double) {
// Внутри actor можно изменять состояние напрямую
balance += amount
}
func withdraw(amount: Double) async -> Bool {
// Проверка и изменение состояния атомарно
if balance >= amount {
balance -= amount
return true
}
return false
}
}
// Использование извне:
let account = BankAccount()
await account.deposit(amount: 100) // Требуется `await`
let success = await account.withdraw(amount: 50)
Почему это лучше мьютексов (locks)? Компилятор обеспечивает безопасность на этапе компиляции, предотвращая случайный доступ к состоянию без синхронизации.