5

ばかげた質問かもしれませんが、確認が必要です。

通常、アプリケーション内で複数回使用できるオブジェクトを扱うときは、次のようなアプローチを使用します。

たとえば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この場合、共有フォーマッタは読み取り専用であるため、異なるスレッドで異なる呼び出しを実行することは有効だと思いますが、専門家からの返信が欲しいです。

前もって感謝します。

4

1 に答える 1

2

NSNumberFormatterは変更可能であるため、通常はスレッド セーフではなく、非スレッド セーフ クラス リストのスレッド セーフの概要(「スレッド非セーフ クラス」セクションを参照) に記載されています。

しかし、オブジェクトを不変オブジェクトとして扱う場合、競合状態について心配する必要はありません。たとえば、複数のスレッドがフォーマッタにアクセスしている場合、フォーマットを変更することはできません。_internal_numberFormatterがまったく変更されておらず、カテゴリにこれら 2 つのメソッドしかない場合は、スレッド セーフと見なす必要があります。

于 2013-04-17T22:40:07.750 に答える