シングルトンメソッドを作成したばかりですが、@synchronized()
よく使うので関数の機能を知りたいのですが、意味がわかりません。
回答:
コードブロックの周りのクリティカルセクションを宣言します。マルチスレッドコードでは、@synchronized
常に1つのスレッドのみがブロック内でそのコードを実行できることを保証します。
それが何をするのかわからない場合、アプリケーションはおそらくマルチスレッドではなく、おそらくそれを使用する必要はありません(特にシングルトン自体がスレッドセーフでない場合)。
編集: 2011年の元の回答にはなかった情報を追加します。
@synchronized
ディレクティブによって保護されているコードの任意の領域に入るのを防止する複数のスレッド@synchronized
ディレクティブ同じオブジェクトを参照します。@synchronized
ディレクティブに渡されるオブジェクトは、「ロック」として使用されるオブジェクトです。異なるオブジェクトがロックとして使用されている場合、2つのスレッドを同じ保護されたコード領域に含めることができます。また、同じオブジェクトをロックとして使用して、2つの完全に異なるコード領域を保護することもできます。
また、たまたまnil
ロックオブジェクトとして渡された場合、ロックはまったく取得されません。
@synchronized
。
この@synchronized
ディレクティブは、Objective-Cコードでその場でミューテックスロックを作成するための便利な方法です。
この@synchronized
ディレクティブは、他のミューテックスロックが行うことを実行します。つまり、異なるスレッドが同じロックを同時に取得するのを防ぎます。
構文:
@synchronized(key)
{
// thread-safe code
}
例:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
これで、上記のコードは完全にスレッドセーフになりました。複数のスレッドで値を変更できるようになりました。
上記はあいまいな例です...
@synchronized(val, oldValue) { ... }
?
@synchronizedブロックは、ロックとロック解除を自動的に処理します。@synchronize同期に使用しているオブジェクトに関連付けられた暗黙のロックがあります。このトピックに関する非常に有益な議論があります。Objective-Cで@synchronizedをロック/ロック解除するにはどうすればよいですか?
@synchronized
あるthread safe
メカニズム。この関数内に記述されたコードの一部はcritical section
、の一部になり、一度に1つのスレッドしか実行できません。
@synchronize
ロックを暗黙的にNSLock
適用しますが、明示的に適用します。
スレッドの安全性を保証するだけであり、それを保証するものではありません。私が言いたいのは、あなたはあなたの車のために専門のドライバーを雇うということです、それでもそれは車が事故に遭遇しないことを保証するものではありません。ただし、確率はわずかなままです。
@synchronized
しても何も起こりません。つまり、保護されないままになります。2)@synchronized
である遅いです。