1. atomic用的什么锁?
os_unfair_lock
2. atomic是否线程安全?
首先atomic的作用域是在setter和getter方法,如果是在atomic的作用域外进行其他操作,比如NSArray的objectAtIndex,都不在atomic的作用域范围内,是无法保证线程安全的。
其次, atomic对setter也是无法保证线程安全的。
原因:
atmoic下的setter方法的内部实现, copy关键字代码如下
-(void) setter(NSObject* newObj) {
os_unfair_lock * mutex;
[mutex lock];
if (obj != newObj) {
[obj release];
obj = [newObj copy];
}
[mutex unlock];
}
这样有几种情况
a. [obj release] 这个时候obj已经被其他线程release过了,就是bad_access错误(MRC 下手动_obj 调用release ,再obj release 即可以验证)
b. 其他线程修改obj 为[ NSNull null]时,发送release消息会崩溃。(经过验证 NSNull 调用release不回崩溃,因为NSNull是NSObject 的子类,该条不会存在)
但是这样感觉挺钻牛角尖,这样项目中oc代码没有哪里是线程安全的,哪怕是加锁了,还是有其他线程可以操作你加锁的代码区域内的用到的对象。