前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS中的atomic一定是线程安全吗

iOS中的atomic一定是线程安全吗

原创
作者头像
新用户
修改2018-09-18 15:34:07
1.3K0
修改2018-09-18 15:34:07
举报
文章被收录于专栏:学习笔记iOS

引言

在iOS开发中,我们常常会用到@property来声明属性,在声明属性的关键字中有一对atomic和nonatomic关键字。

代码语言:javascript
复制
@property (nonatomic, copy) NSString *userName;
@property (atomic, copy) NSString *name;     

其中atomic表示该属性的内存操作是原子性的,nonatomic表示该属性的内存操作是非原子性的。atomic要比nonatomic慢大约20倍。

简单实现

可以简单的认为其实现是类似这样的:

代码语言:javascript
复制

#import <libkern/OSAtomic.h> //引入自旋锁的头文件



@synthesize name = _name;
OSSpinLock oslock = OS_SPINLOCK_INIT;

- (NSString *)name {
   OSSpinLockLock(&oslock);
   return _name;
   OSSpinLockUnlock(&oslock);
}

- (void)setName:(NSString *)name {
    OSSpinLockLock(&oslock);
    if(name != _name) {
        [_name release];
        _name = [name copy];
    }
    OSSpinLockUnlock(&oslock);
}

那使用atomic就能保证线程安全吗?

不能

线程安全是指多个线程在并发执行时同时访问操作同一块内存造成数据错误或冲突,引起执行结果的不确定。

使用了atomic后只是保证了在使用这个属性的getter和setter时的线程安全,并不能保证整个对象是线程安全的。比如一个线程循环的读数据,另一个线程循环的写数据,必然会有线程安全的问题;如果一个线程正在getter或者setter,又有另一个线程同时进行了release操作,则会发生crash

总结

  • atomic只是保证了getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的,因此,线程安全还要开发者自己来处理
  • 相对nonatomic来说atomic更消耗资源且速度慢,因此,如果没有特殊的需求,nonatomic是更好的选择

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 简单实现
  • 那使用atomic就能保证线程安全吗?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档