【发布时间】:2012-06-06 21:16:46
【问题描述】:
我对 Objective-C 中的线程安全有疑问。我已经阅读了其他几个答案,一些 Apple 文档,但对此仍有一些疑问,所以我想问我自己的问题。
我的问题是三折:
假设我有一个数组,NSMutableArray *myAwesomeArray;
折叠 1:
如果我弄错了,请纠正我,但据我了解,使用@synchronized(myAwesomeArray){...} 会阻止两个线程访问同一个代码块。所以,基本上,如果我有类似的东西:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
那么,如果两个线程在same 时间访问same 方法,那么该代码块将是线程安全的。我猜我已经正确理解了这部分。
折叠 2:
如果myAwesomeArray 正被多个线程从不同的方法访问,我该怎么办?
如果我有类似的东西:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
现在,两个方法同时被两个不同的线程访问。如何确保myAwesomeArray 不会出现问题?我是否使用 NSLock 或 NSRecursiveLock 之类的东西?
3 折:
现在,在上述两种情况下,myAwesomeArray 是内存中的 iVar。如果我有一个数据库文件,我并不总是保存在内存中怎么办。每当我想执行数据库操作时,我都会创建一个databaseManagerInstance,并在完成后释放它。因此,基本上,不同的类可以访问数据库。每个类都创建自己的DatabaseManger 实例,但基本上,它们都使用相同的单一数据库文件。在这种情况下,如何确保数据不会因竞争条件而损坏?
这将帮助我理清一些基础知识。
【问题讨论】:
-
@synchronize阻止其他线程访问您锁定的同一个变量,而不是特定的代码块。 -
啊。我知道了。好吧,我想我对@synchronize 指令的理解还不止于此。谢谢! :D
-
@codeBearer 我在stackoverflow.com/a/15393623/412916 Kinda 回答了你的问题。
标签: objective-c ios multithreading