gpt4 book ai didi

ios - 单例中 getter 和 setter 的线程安全

转载 作者:IT王子 更新时间:2023-10-29 05:33:05 28 4
gpt4 key购买 nike

我在 Swift 3 中创建了一个简单的单例:

class MySingleton {
private var myName: String
private init() {}
static let shared = MySingleton()

func setName(_ name: String) {
myName = name
}

func getName() -> String {
return myName
}
}

由于我将 init() 设为私有(private),并且还将 shared 实例声明为 static let,因此我认为初始化程序是线程安全的.但是 myName 的 getter 和 setter 函数呢,它们是线程安全的吗?

最佳答案

您说得对,您编写的那些 getter 不是线程安全的。在 Swift 中,目前实现这一点的最简单(读取最安全)的方法是使用 Grand Central Dispatch 队列作为锁定机制。实现此目的的最简单(也是最容易推理)的方法是使用基本的串行队列。

class MySingleton {

static let shared = MySingleton()

// Serial dispatch queue
private let lockQueue = DispatchQueue(label: "MySingleton.lockQueue")

private var _name: String
var name: String {
get {
return lockQueue.sync {
return _name
}
}

set {
lockQueue.sync {
_name = newValue
}
}
}

private init() {
_name = "initial name"
}
}

使用串行调度队列将保证先进先出执行以及实现对数据的“锁定”。也就是说,数据正在更改时无法读取。在这种方法中,我们使用 sync 来执行实际的数据读写,这意味着调用者将始终被迫等待轮到它,类似于其他锁定原语。

注意:这不是 most performant方法,但它易于阅读和理解。这是避免竞争条件的良好通用解决方案,但并不意味着为并行算法开发提供同步。

资料来源: https://mikeash.com/pyblog/friday-qa-2015-02-06-locks-thread-safety-and-swift.html What is the Swift equivalent to Objective-C's "@synchronized"?

关于ios - 单例中 getter 和 setter 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45710200/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com