我的Objective-C单例线程安全吗?

时间:2018-08-19 23:44:06

标签: objective-c multithreading singleton

我一直在阅读,如果我在这里编写了线程安全的实现,那么很难获得清晰的感觉。

我的吸气剂看起来像

+ (MySingleton *)getSingleton
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        singleton = [[MySingleton alloc] init];
    });
    return singleton;
}

我的接班人是:

+ (void)updateSingleton:(MySingleton *)newSingleton
{
    @syncronized(self) {
        singleton = newSingleton;
    }
}

1 个答案:

答案 0 :(得分:2)

不,这不是线程安全的。两种修改方法之间的排除机制不同。 dispatch_once@synchronized毫无关系。

除定义外,单子绝不能替换。单身人士可以随时存在,一旦完成,就永远不会消失。

此外,getSingleton应该是sharedInstance或一些类似的Objective-C标准绰号。除非方法通过引用返回东西,否则它们决不能以get开头。