2015年4月20日星期一

property nonatomic与atomic(无原子与原子)

为了防止同一变量被不同的线程在某一时间段同时访问,必须加原子琐来保证某次操作的正确性。关于操作的原子性,我看过大神guancheng的一篇http://www.parallellabs.com/2011/04/09/pthread-mutex-lock-and-thread-safety/,这篇文简单的介绍下原子操作。
       给线程加锁的消耗是比较大的,而我们在IOS中不是经常会多个线程访问一个同一个变量,为了提高效率,我们通常会在属性中这样声明:
@property (nonatomic,copy)NSString *userName;
     有同学可能非常疑惑,这样做到底能提高多少效率呢?不这样做又怎样?好,下面我们来写个Demo。
1.首先我使用上面的声明的userName的声明
[html] view plaincopy
  1. @property (nonatomic,copy)NSString *userName;  
  2. - (void)viewDidLoad  
  3. {  
  4.     uint64_t begin =  mach_absolute_time();  
  5.     self.userName = @"username";  
  6.     uint64_t end   = mach_absolute_time();  
  7.     NSLog(@"end - begin = %llu",end-begin);  
  8. }  
运行下结果是:
2012-07-12 19:57:59.679 NavigationDemo[635:f803] end - begin 1236
2.然后我使用下面的声明
[html] view plaincopy
  1. @property (atomic,copy)NSString *userName;  
  2. - (void)viewDidLoad  
  3. {  
  4.     uint64_t begin =  mach_absolute_time();  
  5.     self.userName = @"username";  
  6.     uint64_t end   = mach_absolute_time();  
  7.     NSLog(@"end - begin = %llu",end-begin);  
  8. }  
运行的结果是:
NavigationDemo[726:f803] end - begin  8330
3.可以明显看出声明为nonatomic能提高好几倍的效率,所以在属性声明的时候,当不会在多线程下操作此成员的时候声明为非原子性能极大的提高效率,希望看完这篇文后更多的同学能使用这个声明。

没有评论:

发表评论