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

news/2024/7/20 20:15:11 标签: swift, 开发语言, ios

引言

随着移动应用和服务的复杂性不断增加,处理并发操作变得越来越重要。在 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 语言提供了一种简单且安全的并发编程模型,使得开发者可以更轻松

 


http://www.niftyadmin.cn/n/429341.html

相关文章

Springboot Apollo配置yml

1.背景: 项目都是配置的Apollo配置中心来进行配置的。新功能需要yml格式的数据(层级结构更清晰) 2.问题: 1)Apollo是否支持yml格式的配置信息? 2)配置好了以后读取不到Apollo配置的yml。 3…

新买的电脑怎么用U盘重装系统?新买的电脑用U盘重装系统教程

新买的电脑怎么用U盘重装系统?用户新买了电脑,想知道怎么用U盘来重装新买的电脑,用U盘来重装电脑其实非常简单,用户需要准备一个U盘,然后完成U盘启动盘的安装,接着按照以下分享的新买的电脑用U盘重装系统教…

2023.6.8-TS-yum update集群后奔溃故障(已解决)

2023.6.8-TS-yum update集群后奔溃故障(已解决) 1、故障背景 自己在安装falco软件时,使用yum update升级了系统后,就出现这个情况了。。。 2、报错现象 kubeclt无法查看pod kubectl get poE0608 09:38:49.094714 2268 memcache.go:265] couldnt ge…

pyspark安装教程

pyspark安装教程 一、Windows下配置pyspark环境1.1 JDK下载安装1.2 Scala下载安装1.3 spark下载安装1.4 Hadoop下载安装1.5 pyspark下载安装 二、pyspark原理简介 一、Windows下配置pyspark环境 在python中使用pyspark并不是单纯的导入pyspark包就可以实现的,而是需…

TypeScript知识汇总

一、ts简介 1、什么是ts 2、ts增加了什么 二、TypeScript开发环境搭建 注:如果npm i运行报错,需要以管理员身份运行一次,以上主要就是tsc xxx.ts 三、ts的基本类型——ts相当于是给js可以指定类型 //number、string、boolean等常用类型&am…

梳理Retrofit的知识体系

作者:RainyJiang 在学习Retrofit后,由于它本身就是OKHttp的封装,面试中也经常会被一起问到;单纯的解析它的源码学习难免会有点无从下手,往往让人抓不住重点,学习效率并不是很高,本文从提出几个问…

chatgpt赋能python:Python中如何居中输入文字

Python中如何居中输入文字 Python是一种流行的编程语言,因其易学易用而闻名。尽管Python的主要用途是开发程序,但是有时需要在输出中使用美观的文本格式。本文将详细介绍如何在Python中居中输入文字。 什么是文本居中? 文本居中是指将文本…

JavaWeb笔记(二)

数据库基础 数据库是学习JavaWeb的一个前置,只有了解了数据库的操作和使用,我们才能更好地组织和管理网站应用产生的数据。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJ1neG69-1686619058026)(null)] 什么是数据库 数…