注意:我正在使用objective-c ++,其中允许非编译时常量(https://stackoverflow.com/a/12304815/3101492)
+ (Foo)sharedFoo
{
static Foo *foo = [Foo new];
return foo;
}
静态初始化程序只能运行一次,但它是否是线程安全的,如果多个线程同时调用+(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;
}
我基本上问为什么第一行不能
static Foo *foo = [Foo new];
如果我们知道静态本地var初始化只运行一次就完全跳过dispatch_once。
编辑:啊好的,我找到了答案。 1.首先,我意识到我正在使用objective-c ++,它允许上面的代码进行编译(并在运行时运行它) 2.第二,编译器将该代码转换为"天真的"没有dispatch_once的单例初始化程序的版本,因此它确实不是线程安全的。答案 0 :(得分:0)
Is local static variable initialization thread safe?
简短回答: -
不,它不是线程安全的。