jas*_* na 5 objective-c objective-c++ static-initialization
注意:我使用的是Objective-C ++,其中允许使用非编译时常量(/sf/answers/861337081/)
+ (Foo)sharedFoo
{
static Foo *foo = [Foo new];
return foo;
}
Run Code Online (Sandbox Code Playgroud)
静态初始化程序只能运行一次,但是它是否具有线程安全性,例如,如果多个线程同时调用+(Foo)sharedFoo,是否可以保证[Foo new]仅运行一次?
我问是因为如果这样,那么为什么建议obj-C中的单例模式使用如下所示的dispatch_once呢?
+ (Foo)sharedFoo {
static Foo *foo = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
foo = [Foo new];
});
return foo;
}
Run Code Online (Sandbox Code Playgroud)
我本质上是在问为什么第一行不能只是
static Foo *foo = [Foo new];
Run Code Online (Sandbox Code Playgroud)
如果我们知道静态本地var初始化仅运行一次,则只需完全跳过dispatch_once。
编辑:好的,我找到了答案。1.首先,我意识到我使用的是Objective-C ++,它允许上述代码进行编译(并在运行时运行)2.第二,编译器将该代码转换为不带dispatch_once的单例初始化器的“原始”版本,从而使它确实不是线程安全的。
Is local static variable initialization thread safe?
Run Code Online (Sandbox Code Playgroud)
简短回答:-
不,它不是线程安全的。