美文网首页
atomic是否线程安全?

atomic是否线程安全?

作者: minking1982 | 来源:发表于2017-07-16 21:51 被阅读0次

在申明属性的时候默认的是atomic原子性,在使用属性时我们会手动设置noatomic表示非原子性,这样做以提高访问效率,不过多线程访问属性时数据是不安全的。那么atomic原子性是否就可以保证线程安全了呢?

这个需要分两种情况来讲

  • 对于int,float之类的属性,使用atomic能够保证数据线程安全,atomic的这类属性可以保证线程访问时的顺序执行。

  • 对于NS类型的数据,使用atomic却并不一定可以保证其线程安全。

要理解这个问题先要讲述一下属性合成。
noatomic属性合成时如下

对于一般数据类型的合成
-(void)setNumber:(int) number
{
    _number = number;
}
 -(int) number
{
  return number;
}

对于NSString或者NSArray的合成
@property(nonatomic,copy)NSString* str;

-(void)setStr:(NSString*)str
{
  _str = [str copy];
}
-(NSString*)str
{
  return str;
}

atomic属性合成

对于一般数据类型的合成
-(void)setNumber:(int) number
{
  @synchronized(self)
  {
  self.number = number;
  }
}
 -(int) number
{
  @synchronized(self)
  {
    return number;
  } 
}

对于NSString或者NSArray的合成
@property(atomic,copy)NSString* str;

-(void)setStr:(NSString*)str
{
  @synchronized(self)
  {
    _str = [str copy];
  }
}
-(NSString*)str
{
  @synchronized(self)
  {
    return str;
  }
}

由此可见atmoic只针对于setter和getter方法,所以对于基础数据类型如int等,其可以保证数据的线程安全。 在上例中的@property(atomic,copy) NSString* str;同样也是线程安全的。因为对str的操作都有@synchronized(self)保证同步。

但是对于@property(atomic,strong) NSMutableString* str; 这样的属性,如果仅仅对于str的读取和赋值,atomic同样也能保证线程顺序执行。但是由于NSMutableString是可变类型,对于可变类型对应的add,insert,remove等方法是对于指针所指向内存区域的操作,而atomic无法保证指针所指向区域的线程访问安全,然而对于这类数据类型,这种操作是很常见的。

由上分析得出以下结论

  • atomic原子性,它仅限于getter,setter时的线程安全
  • 因为atomic原子性,它限于getter,setter时的线程安全,所以对于一般数据类型如int,float它是可以保证线程安全的,对于NSString这种不可变字符串也能保证线程安全。
  • 对于NSMutable类型的属性,atmoic无法保证线程安全,对于这种属性往往都是对于数据块的读写操作,atmoic无法保证对于指针指向的数据库的线程安全。这种属性时使用nonatomic,自己处理线程安全。
  • 同样的对于NSMutable开头的一些类,使用atmoic还是会导致线程问题的

相关文章

  • atomic是否线程安全?

    在申明属性的时候默认的是atomic原子性,在使用属性时我们会手动设置noatomic表示非原子性,这样做以提高访...

  • nonatomic和atomic的区别

    nonatomic:非线程安全 atomic:线程安全 atomic对属性的set 和get方法进行加锁,保证当前...

  • 问题:使用atomic一定是线程安全的吗?

    atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。 ...

  • 题库整理(一)

    1.atomic和nonatomic的区别?atomic一定是线程安全的吗?atomic如何实现atomic? a...

  • atomic是否是线程安全的?

    转自今天所看到的答案,赶紧记录下来。 首先结论是atomic是线程安全的,不是网络上流传的非线程安全。 以下是某位...

  • atomic与线程安全

    本篇文章采用的源码是objc4-781版本 使用atomic一定是线程安全的吗? atomic不是绝对的线程安全。...

  • iOS编程中atomic和nonatomic的区别

    atomic atomic 的本意是指属性的存取方法是线程安全(thread safe).但不保证整个对象都是线程...

  • IOS 原子性和非原子性

    atomic:原子性,只有一个线程可以同时访问实例。atomic 是线程安全的(因为会为setter方法加锁)默认...

  • iOS编程各个修饰符分别

    atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全。在多线程环境下,原子操作...

  • atomic和线程安全的理解

    atomic和线程安全的理解 线程安全 如果多线程下,一直操作i = i + 1,可能出现线程不安全 i = i ...

网友评论

      本文标题:atomic是否线程安全?

      本文链接:https://www.haomeiwen.com/subject/gzjxkxtx.html