私はいくつかの外国のコードで何かを読んだことがあり、私の仮定を確認したいと思います:
@synchronized(self)
は、プロパティを設定するときにself
プレフィックスを取り除くために使用されます。
したがって、以下の例では、ローカル変数だけでなく、インスタンスのstrText
を設定していますよね?
- (void)myfunction{
NSString * strText = @"var in function";
@synchronized(self)
{
strText = @"var class (self.strText)";
}
}
これを読んでください ドキュメント
@synchronized()
ディレクティブは、単一のスレッドで使用できるようにコードのセクションをロックします。他のスレッドは、スレッドが保護されたコードを終了するまで、つまり実行が@synchronized()
ブロックの最後のステートメントを超えて続行されるまでブロックされます。
@synchronized()
ディレクティブは、self
を含むObjective-Cオブジェクトを唯一の引数として取ります。
Massimo Cafaroが指摘 :「競合状態を回避するために、アプリケーションがマルチスレッドになる前に、すべての相互排除オブジェクトを作成するのが最も安全です。」
@synchronized(self)は、自己を取り除くために使用されます。プレフィックス。
したがって、私の例では、クラスで設定した関数ではなく、strTextを設定しました。
2つの概念が混同されています。
@synchronized(self) { ... }
は、self
オブジェクトをセマフォとして使用する場合にのみブロックをロックします。self.whatever
を単にwith
にする必要をなくす、他の言語のような架空のwhatever
ステートメントのようなものはありません。スタンフォードCS193Pオンラインコースを受講して、言語をブラッシュアップすることをお勧めします。マルチスレッド環境では、複数のスレッドが同じメモリアドレスにアクセスしようとすると「競合状態」が発生する可能性があるため、このような状態を回避するには、「ミューテックスロック(相互排除)」を使用する必要があります。スレッドが同じメモリアドレスまたはコンテンツに同じ時点でアクセスし、一度に1つのスレッドのみを許可します。これは、@ synchronizedディレクティブを使用してObjectiveCで実現できます。
例:通常、シングルトンデザインパターンまたはクラスを実装している間、iOSプロジェクトで以下のようなコードスニペットが表示されます。
+(id)getSingletonInstance
{
@synchronized(self)
{
if (singletonObj == nil)
{
singletonObj = [[self alloc] init];
}
return singletonObj;
}
}