Защитава ли @synchronize от условия на състезание в този случай?

Искам да използвам Core Data във фонови нишки и NSOperationQueue. Сега си помислих защо просто не трябва да създам клас, съдържащ всички неща от стека на основните данни със свойство на 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