您现在的位置是:首页 >技术杂谈 >[Swift 开发] 数组线程安全 Actors网站首页技术杂谈

[Swift 开发] 数组线程安全 Actors

文件夹_IOS 2024-10-21 12:01:05
简介[Swift 开发] 数组线程安全 Actors

引言

随着移动应用和服务的复杂性不断增加,处理并发操作变得越来越重要。在 Swift 5.5 中引入了一个全新的特性,即 Swift Actor(角色),它为我们提供了一种简单且安全的并发编程模型。本篇博客将深入探索 Swift 中的 Actor 模型,并介绍它在实际开发中的运用场景和优势。

Actor 基本原理

  1. Actor 是一种并发编程模型,它通过限制只有一个线程可以访问 Actor 内部的状态来保证线程安全。
  2. Actor 内部的状态只能由 Actor 自身的方法进行修改,其他线程无法直接访问和修改。
  3. Actor 之间通过异步消息传递进行通信,确保了线程安全性 

actor关键字来构建Actor, 和class. struct 和enum的区别

  1. actor和class都是引用类型
  2. Actor 和 Class 区别在于 Actor 遵守了 Actor 协议,可以保证在并发环境下操作数据的安全性
  3. Actor 不支持继承
  4. 都有方法,属性,构造方法
  5. 可以遵循协议
  6. 所有的方法和属性都是static,因为没有self的概念

 

Actor 的定义和访问 

  1. 在 Swift 中,我们可以使用 actor 关键字来定义一个 Actor 类。
  2. Actor 类中的方法默认是异步的,并且可以通过 nonisolated 关键字将某些方法标记为非隔离的,以便可以在 Actor 外部进行调用。
  3. 通过在方法前添加 async 关键字,我们可以在 Actor 内部进行异步操作。
  4. Actor 内部的状态可以通过声明为 private 或 fileprivate 来确保只有 Actor 内部可以访问。
  5. 通过使用 await 关键字,我们可以等待 Actor 方法的结果,并确保线程安全。
  6. Actor 的状态修改只能在 Actor 内部进行,这样可以避免竞态条件和数据访问冲突。

 

测试例子

// 创建对象
actor MyActor {
    private var sharedArr = [1,2,3,4,5]

    // 读取数据
    func readData() async -> [Int] {
        return sharedArr
    }

    // 添加数据
    func writeData(value: Int) async {
        sharedArr.append(value)
    }
    
    // 删除数据
    func removeData() async {
        sharedArr.removeLast()
    }
}

 测试异步读写数据

// 创建 MyActor 实例
let myActor = MyActor()

 异步读取共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
}

// 异步写入共享数据
Task {
    await myActor.writeData(value: 10)
    print("write Data 10")
}

// 异步读取共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
}

// 结果
// read data: 1
// read data: 2
// read data: 3
// read data: 4
// read data: 5
// write Data 10
// read data: 1
// read data: 2
// read data: 3
// read data: 4
// read data: 5
// read data: 10
// 异步读写数据,数据安全

 测试异步读取和删除数据

// 异步删除共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
}

// 异步删除共享数据
Task {
    for _ in (0...2){
        await myActor.removeData()
        print("remove Data")
    }
}

// 异步读取共享数据
Task {
    for data in await myActor.readData() {
        print("read data: (data)")
    }
    print(await myActor.readData())
}

// 结果
// read data: 1
// read data: 2
// read data: 3
// read data: 4
// read data: 5
// read data: 1
// read data: 2
// read data: 3
// remove Data
// read data: 4
// remove Data
// read data: 5
// remove Data
// [1, 2]

 因为在线程中,打印数据顺序不固定,结果保证了线程安全

 结论

通过引入 Swift Actor,Swift 语言提供了一种简单且安全的并发编程模型,使得开发者可以更轻松

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。