【发布时间】:2018-08-16 00:57:25
【问题描述】:
我有一个应用程序,它有一个在整个应用程序中存储信息的单例。但是,当使用来自不同线程的单例时,这会产生一些数据竞争问题。
这里有一个非常简单的问题版本:
单例
class Singleton {
static var shared = Singleton()
var foo: String = "foo"
}
单例的使用(为简单起见,来自 AppDelegate)
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
DispatchQueue.global().async {
var foo = Singleton.shared.foo // Causes data race
}
DispatchQueue.global().async {
Singleton.shared.foo = "bar" // Causes data race
}
return true
}
}
有什么方法可以确保单例是线程安全的,因此可以在应用程序的任何地方使用它,而不必担心你在哪个线程中?
这个问题不是与Using a dispatch_once singleton model in Swift 重复,因为(如果我理解正确的话)他们正在解决访问单例对象本身的问题,但不能确保阅读和其属性的写入是线程安全的。
【问题讨论】:
-
参见stackoverflow.com/questions/38373338/… 获取示例解决方案。
-
这似乎工作得很好。感谢您为我指明正确的方向!
-
这是一个更好的解决方案(参见使用屏障同步进行写入的解决方案):stackoverflow.com/a/44023665/1226963
-
@sundance - 他不担心任何与单例对象本身的竞争。他担心同步访问单例的属性,这是一个不同的问题。
标签: swift thread-safety swift4