在这种情况下,@ synchronize是否可以防止竞争条件?

时间:2011-06-01 13:41:46

标签: iphone multithreading ios ipad nsoperationqueue

我想在后台线程和NSOperationQueue中使用Core Data。现在我想为什么我不应该只创建一个包含NSManagedObjectContext属性的所有Core Data堆栈的类,然后让这个属性成为原子?

我不确定@synchronize(self) {...}的一件事是:假设我有一个被认为是线程安全的属性:

@property (retain) NSManagedObjectContext *moc;

每个NSOperation或线程都访问具有此moc属性的CoreDataTools类。他们像这样访问这个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方法。我想知道这是否有效。

2 个答案:

答案 0 :(得分:4)

 @synchronized(self) { /* lock is effective inside here only */ } 

答案 1 :(得分:2)

没有。每个线程都应该有自己的托管对象上下文。

More info: Concurrency with Core Data