Коллекция NSMutableArray и блоки @Synchronized
В Objective C я использую экземпляр NSMutableArray из различных потоков и использую @synchronized, чтобы сделать его потокобезопасным. в настоящее время все мои доступы к этому массиву защищены блоком @synchronized, даже objectAtIndex: метод. Тем не менее, мне интересно, какие вызовы методов действительно должны быть защищены с помощью @synchronized. мне нужно защитить доступ для чтения?
Что произойдет, если ObjectAtIndex не защищен и вызывается в то же время, что и removeObject?
Если все методы защищены @synchronized, как насчет производительности? (Я пишу игровой сервер tcp / udp и действительно не хочу чрезмерно защищать этот массив, если он уменьшит перф или генерирует блокировки).
например, я полагаю, что метод containsObject: будет перечислять, чтобы найти объект, и что мне следует избегать параллельного вызова removeObject: в другом потоке.
Возможно, хорошим решением было бы иметь слишком разные блокировки (для чтения и записи) ...
Помощь и предложение приветствуются!
Большое спасибо.
Ниже приведен пример кода для иллюстрации:
@interface TestClass : NSObject
{
NSMutableArray * array;
}
@end
@implementation TestClass
- (id)init
{
self = [super init];
if (self)
{
array = [NSMutableArray array];
}
return self;
}
-(id)objectAtIndex:(NSUInteger)index
{
@synchronized(array) **// IS IT USEFUL OR NOT ??**
{
return [array objectAtIndex:index];
}
}
-(void)removeObject:(id)object
{
@synchronized(array)
{
[array removeObject:object];
}
}
-(void)compute
{
@synchronized(array)
{
for (id object in array)
{
[object compute];
}
}
}
@end