Atomic

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代码没有哪里是线程安全的,哪怕是加锁了,还是有其他线程可以操作你加锁的代码区域内的用到的对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容