Защищает ли @synchronize от условий гонки в этом случае?

Я хочу использовать Core Data в фоновых потоках и NSOperationQueue. Теперь я подумал, почему бы мне просто не создать класс, содержащий все элементы стека Core Data со свойством NSManagedObjectContext, а затем просто сделать это свойство атомарным?

Одна вещь, которую я не уверен в @synchronize(self) {...}, заключается в следующем: предположим, что у меня есть свойство, которое считается потокобезопасным:

@property (retain) NSManagedObjectContext *moc;

Каждая NSOperation или поток обращается к классу CoreDataTools, который имеет это свойство moc. Они получают доступ к этому свойству moc следующим образом:

// Assume: Inside an NSOperation or new thread here...
NSManagedObjectContext *moc = [[CoreDataTools sharedInstance] moc];

// Do a lot of things with moc. Add and remove 20 objects.

Будет ли это вообще эффективно? Я не понимаю, КОГДА эта блокировка эффективна. Только в случае фактического доступа к собственности? Или я могу безопасно работать с экземпляром NSManagedObjectContext до тех пор, пока NSOperation или вызываемый метод фонового потока не будет выполнен и не вернется?

Я знаю, что у NSMangagedObjectContext есть метод -lock. Я хочу знать в целом, будет ли это работать или нет.


person Proud Member    schedule 01.06.2011    source источник
comment
@synchronized(self) { /* здесь блокировка действует только внутри */ }   -  person Rayfleck    schedule 01.06.2011
comment
Это был ответ на вопрос. Сделай это, и я приму это! знак равно   -  person Proud Member    schedule 01.06.2011


Ответы (2)


Нет. Каждый поток должен иметь свой собственный контекст управляемого объекта.

Дополнительная информация: параллелизм с базовыми данными

person TheBlack    schedule 01.06.2011
comment
Как насчет механики @synchronize в целом? - person Proud Member; 01.06.2011
comment
Тема довольно широка, чтобы ее можно было объяснить здесь в целом, но в целом @synchronize является рекурсивной блокировкой и может снизить производительность, если это то, что вам нужно. NSCondition в этом плане гораздо лучший вариант. - person TheBlack; 01.06.2011

person    schedule
comment
Кроме того, если вам действительно нужно что-то заблокировать, @synchronized() будет самым медленным способом: perpendiculo.us/?p =133 . - person Brad Larson; 01.06.2011
comment
@Brad Larson - 100 миллионов блокировок за 10 секунд. Я не думаю, что это все слишком медленно. - person rein; 12.08.2012