怀疑与可以多次使用的对象(如格式化程序)的并发性

时间:2013-04-17 21:30:07

标签: objective-c concurrency code-reuse nsformatter

也许是一个愚蠢的问题,但我需要一些确认。

通常,当我处理可在我的应用程序中多次使用的对象时,我会使用如下方法。

创建扩展名,例如NSDecimalNumber+Extension,或类实用程序,其中创建数字格式化程序,如下所示。

+ (NSNumberFormatter*)internal_sharedNumberFormatter
{
    static NSNumberFormatter* _internal_numberFormatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _internal_numberFormatter = [[NSNumberFormatter alloc] init];
        // other configurations here...
    });

    return _internal_numberFormatter;
}

+ (NSString*)stringRepresentationOfDecimalNumber:(NSDecimalNumber*)numberToFormat
{
    NSString *stringRepresentation = [[self class] internal_sharedNumberFormatter] stringFromNumber:numberToFormat];
    return stringRepresentation;
}

这种方法非常好,因为例如格式化程序的创建成本很高。但它也可以应用于其他情况。

现在,我的问题如下。

这种方法在涉及不同执行路径(不同线程)的情况下是否也有效?

所以,如果我在主线程上调用第一个stringRepresentationOfDecimalNumber然后在另一个线程中调用,会发生什么?

我认为在不同的线程中对stringRepresentationOfDecimalNumber执行不同的调用是有效的,因为在这种情况下,共享格式化程序只能读取,但我想得到专家的回复。

提前致谢。

1 个答案:

答案 0 :(得分:2)

NSNumberFormatter是可变的,因此它通常不是线程安全的,并且在非线程安全类列表中的Thread Safety Summary中引用(请参阅“线程不安全类”部分)。

但是如果将对象视为不可变对象,则不必担心竞争条件。因此,例如,如果有多个线程访问格式化程序,则无法更改格式。如果_internal_numberFormatter没有以任何方式改变,并且您在类别中只有这两种方法,那么您应该认为它是线程安全的。