4

SO で行った以前の議論に基づいて (フォーマッタのように複数回使用できるオブジェクトとの並行性に関する疑問を参照)、ここでは、アプリケーションの有効期間中に一度だけ作成される (そして決して変更されない) オブジェクトについて、より理論的な質問をしています。したがって、読み取り専用) であり、異なるスレッドからアクセスできます。単純な使用例は、Core Data のものです。フォーマッタは、さまざまなスレッド (メイン スレッド、インポート スレッドなど) で使用できます。

NSFormatterたとえば、作成には非常にコストがかかります。それに基づいて、一度作成してから再利用できます。従うことができる典型的なパターンは次のとおりです (NSFormatter の記事で@matttによって強調されています)。

+ (NSNumberFormatter *)numberFormatter {
    static NSNumberFormatter *_numberFormatter = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _numberFormatter = [[NSNumberFormatter alloc] init];
        [_numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    });

    return _numberFormatter;
}

従うべき非常に良いアプローチであると確信していても (一種の読み取り専用/不変オブジェクトが作成されます)、フォーマッターはスレッドセーフではないため、スレッドセーフな方法で使用することは危険です。作成者がクラッシュが発生する可能性があることに気付いた別のスレッドから使​​用すると、 NSDateFormatter がクラッシュするの引数に関する議論を見つけました。

NSDateFormatters はスレッドセーフではありません。同時に同じフォーマッタを使用しようとするバックグラウンド スレッドがありました (したがってランダム性)。

では、異なるスレッドからフォーマッタにアクセスする際の問題は何でしょうか? 従うべき安全なパターンはありますか?

4

2 に答える 2