如果我有一些看起来像
的东西class Foo {
static shared = Foo()
init() {
print("init Foo")
let _ = Bar.shared
}
}
class Bar {
static shared = Bar()
init() {
print("init Bar")
let _ = Foo.shared
}
}
// somwehere else:
let _ = Foo.shared
然后应用程序卡住了。什么都没发生。我知道这个设计是错误的,但我想知道为什么应用程序没有崩溃,报告错误或至少打印循环。上面的代码打印
init Foo
init Bar
就是这样,表明它没有循环而只是卡住了。关于发生了什么的想法?
答案 0 :(得分:3)
在Swift中,静态类型属性以保证线程安全的方式懒惰地初始化。
中的注释存储类型属性在首次访问时会被懒惰地初始化。 它们只保证初始化一次,即使访问时也是如此 多个线程同时进行,不需要标记 使用惰性修饰符。
此只有一次功能使用dispatch_once
- 类似于需要互斥的东西(或其本身)。
初始化Foo.shared
时,Foo.shared
的锁被锁定。当它被锁定时,Bar.shared
需要初始化,因此Bar.shared
的锁被锁定。虽然两者都被锁定,Foo.shared
需要初始化,但是它的锁定已经被锁定,所以请等待锁定被释放...
我们称这种情况为死锁。