詳解Objective-C 2.0 第2版 によれば次のような定義である。
プログラム内のあるプロックを、複数のスレッドが同時に実行しないように指定することができます。このために、
@synchronized
というコンパイラ指示子を使って次のように記述します。
他のスレッドから守るため、ロックして処理したいオブジェクトを@synchronized
で囲む。キューの制御などに使えそう。
@synchronized(obj) {
// objのロックを取得して、排他的に処理を行う。
}
singletonパターンを実装する際、スレッドセーフな動作のため@synchronized
を利用できます。その他の方法として、iOSプラットフォーム上ではdispatch_once()
を利用することもできます。
+ (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)を利用したほうが良いと思います。
参考