我对Objective-C中的线程安全性有疑问.我已经阅读了其他几个答案,一些Apple文档,但仍然对此有一些疑问,所以我想问我自己的问题.
我的问题有三个:
假设我有一个数组, NSMutableArray *myAwesomeArray;
折叠1:
现在纠正我,如果我错了,但从我的理解,使用@synchronized(myAwesomeArray){...}将阻止两个线程访问相同的代码块.所以,基本上,如果我有类似的东西:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
Run Code Online (Sandbox Code Playgroud)
那么,如果两个线程访问相同的方法相同的时间,代码块将是线程安全的.我猜我已经理解了这一部分.
折叠2:
如果myAwesomeArray被不同方法的多个线程访问,我该怎么办?如果我有类似的东西:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
Run Code Online (Sandbox Code Playgroud)
现在,两个方法同时由两个不同的线程访问.我如何确保myAwesomeArray不会出现问题?我是否使用类似NSLock或NSRecursiveLock的东西?
折3:
现在,在上面的两个案例中,myAwesomeArray是一个内存中的iVar.如果我有一个数据库文件,我并不总是留在内存中怎么办?databaseManagerInstance每当我想执行数据库操作时,我都会创建一个,并在完成后释放它.因此,基本上,不同的类可以访问数据库.每个类都创建自己的实例DatabaseManger,但基本上,它们都使用相同的单个数据库文件.在这种情况下,如何确保数据不会因竞争条件而损坏?
这将帮助我清除一些基本原理.
参考这个答案,我想知道这是对的吗?
@synchronized不会使任何代码"线程安全"
当我试图找到支持此声明的任何文档或链接时,没有成功.
任何评论和/或答案将在此受到赞赏.
为了更好的螺纹安全性,我们可以使用其他工具,这对我来说是已知的.
我搜索并发现不可变是线程安全而可变不是.这可以.但是我得到了误导性的注释,博客,关于线程安全的原子与非原子的答案,请给出答案的解释.
假设有一个名为"name"的原子字符串属性,如果[self setName:@"A"]从线程A调用,[self setName:@"B"]从线程B调用,并[self name]从线程C 调用,则不同线程上的所有操作将串行执行,这意味着如果一个线程正在执行setter或getter,然后其他线程将等待.这使得属性"name"读/写安全,但如果另一个线程D [name release]同时调用,则此操作可能会导致崩溃,因为此处不涉及setter/getter调用.这意味着对象是读/写安全(ATOMIC)但不是线程安全的,因为另一个线程可以同时向对象发送任何类型的消息.
如果属性"name"是非原子的,那么上面例子中的所有线程--A,B,C和D将同时执行,产生任何不可预测的结果.在原子的情况下,A,B或C中的任何一个将首先执行,但D仍然可以并行执行.
你对此的评论将有助于我们......
而我的问题是,"这在可可,原子或非原子中是线程安全的吗?"