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