gpt4 book ai didi

objective-c - 对像格式化程序这样可以多次使用的对象的并发性存疑

转载 作者:太空狗 更新时间:2023-10-30 03:54:04 24 4
gpt4 key购买 nike

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

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

创建一个扩展,例如 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 的不同调用是有效的,因为共享格式化程序在这种情况下是只读的,但我希望得到专家的答复。

提前致谢。

最佳答案

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

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

关于objective-c - 对像格式化程序这样可以多次使用的对象的并发性存疑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com