最初のコード スニペットのコードが終了しない場合、@synchronizedステートメントに関係なく、2 番目のコード スニペットは呼び出されません。スレッドは、実行中のコードによってブロックされています。このステートメントは、複数の@synchronizedスレッド間でデータ アクセスを同期するためのものであり、有用であるためには、参加しているすべてのスレッドが実際にステートメントを使用する必要があります。参加しているすべてのスレッドが「同意」しない限り、データ構造へのアクセスを「魔法のように」ロックすることはありません。
@synchronizedとにかく、特定の(単一の)スレッドで1つのメソッドのみが実行されるようにするために使用しません。
その使用の具体的な例を示すNSMutableArrayために、異なるスレッドから同時に変更されないように保護したい (データの破損につながる可能性がある) があるとします。その場合、@synchronized同じロックトークンを持つブロックで常にアクセスできます。
例:
//Thread 1:
@synchronized (myArray) {
[myArray addObject:@"foo"];
}
//Thread 2:
@synchronized (myArray) {
[myArray removeObjectAtIndex:0];
}
これにより、 で囲まれたコード ブロックが@synchronized同時に実行されなくなります。1 つのスレッドがブロックに入ると、他のスレッドはそれが終了するまで待機しますが、同じステートメントを使用している場合に限ります。@synchronizedあるスレッドで使用するのを忘れた場合、別のスレッドで使用してもまったく役に立ちません。