ロック(@synchronized)操作は、配列全体を何度もコピーするよりもはるかに高速です。もちろん、これは配列に含まれる要素の数と、配列が実行される頻度によって異なります。このメソッドを同時に実行しているスレッドが10個あるとします。
- (void)Callback
{
[m_mutableArray addObject:[NSNumber numberWithInt:3]];
//m_mutableArray is instance of NSMutableArray declared somewhere else
NSArray* tmpArray = [m_mutableArray copy];
NSInteger sum = 0;
for (NSNumber* num in tmpArray)
sum += [num intValue];
//Do whatever with sum
}
毎回n+1個のオブジェクトをコピーしています。ここでロックを使用できますが、反復する要素が100kある場合はどうなりますか?配列は反復が完了するまでロックされ、他のスレッドはロックが解除されるまで待機する必要があります。ここでオブジェクトをコピーする方が効果的だと思いますが、それはそのオブジェクトの大きさや反復で何をしているのかにも依存します。ロックは常に最短時間保持する必要があります。だから私はこのようなものにロックを使用します。
- (void)Callback
{
NSInteger sum = 0;
@synchronized(self)
{
if(m_mutableArray.count == 5)
[m_mutableArray removeObjectAtIndex:4];
[m_mutableArray insertObject:[NSNumber numberWithInt:3] atIndex:0];
for (NSNumber* num in tmpArray)
sum += [num intValue];
}
//Do whatever with sum
}