使用对象上并发怀疑,可多次使用像格式化(Doubts on concurrency with obj

2019-08-31 10:13发布

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

通常,当我处理,可我的应用程序中多次使用的对象我用类似下面的方法。

创建扩展,例如说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在不同的线程,因为共享的格式,在这种情况下,只有读书,但我希望有专家的答复。

提前致谢。

Answer 1:

NSNumberFormatter是可变的,所以一般不是线程安全的,并引用线程安全概要 (请参见“线程安全类”一节)在非线程安全类的列表。

但是,如果你把你的对象作为不可变对象,你不担心竞争条件。 因此,例如,你不能,如果有多个线程访问的格式更改格式。 如果_internal_numberFormatter是不以任何方式被改变,你刚才在类这两种方法,你应该考虑一下线程安全的。



文章来源: Doubts on concurrency with objects that can be used multiple times like formatters