我对 Objective-C 中的线程安全有疑问。我已经阅读了其他几个答案,一些Apple文档,但对此仍有一些疑问,所以我想问我自己的问题。
我的问题是三个方面:
假设我有一个数组,NSMutableArray *myAwesomeArray;
折叠 1:
如果我弄错了,现在纠正我,但据我了解,使用@synchronized(myAwesomeArray){...}
将阻止两个线程访问同一个代码块。所以,基本上,如果我有类似的东西:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
那么,如果两个线程同时访问同一个方法,那么该代码块将是线程安全的。我猜我已经正确理解了这部分。
折叠 2:
myAwesomeArray
如果被多个线程从不同的方法访问,我该怎么办?如果我有类似的东西:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
现在,这两种方法都由两个不同的线程同时访问。我如何确保myAwesomeArray
不会有问题?我是否使用 NSLock 或 NSRecursiveLock 之类的东西?
折叠 3:
现在,在上述两种情况下,myAwesomeArray
内存中是一个 iVar。如果我有一个数据库文件,我并不总是保存在内存中怎么办。databaseManagerInstance
每当我想执行数据库操作时,我都会创建一个,并在完成后释放它。因此,基本上,不同的类可以访问数据库。每个类都创建自己的实例DatabaseManger
,但基本上,它们都使用相同的单个数据库文件。在这种情况下,如何确保数据不会因竞争条件而损坏?
这将帮助我理清一些基本面。