13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

synchronized指示子について

Last updated at Posted at 2013-11-26

詳解Objective-C 2.0 第2版 によれば次のような定義である。

プログラム内のあるプロックを、複数のスレッドが同時に実行しないように指定することができます。このために、@synchronizedというコンパイラ指示子を使って次のように記述します。

他のスレッドから守るため、ロックして処理したいオブジェクトを@synchronizedで囲む。キューの制御などに使えそう。

@synchronized(obj) {
    // objのロックを取得して、排他的に処理を行う。
}

singletonパターンを実装する際、スレッドセーフな動作のため@synchronizedを利用できます。その他の方法として、iOSプラットフォーム上ではdispatch_once()を利用することもできます。

@synchronized:

+ (id)sharedInstance {
    static MyClass *instance = nil;
    @synchronized(self) {
        if (!instance) {
            instance = [[MyClass alloc] init];
        }
    }
    return instance;
}

dispatch_once():

+ (id)sharedInstance {
    static MyClass *instance;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        instance = [[MyClass alloc] init];
    });
    return instance;
}

この実装は スレッドセーフかつ呼び出しを1回のみに限定する という点を満たす必要がありますが、iOSプラットフォーム上においてはどちらも満たしているdispatch_once(GCD = Grand Central Dispatch)を利用したほうが良いと思います。

参考

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?