zoukankan      html  css  js  c++  java
  • 使用atomic一定是线程安全的吗?

    这个问题很少遇到,但是答案当然不是。
    atomic在set方法里加了锁,防止了多线程一直去写这个property,造成难以预计的数值。但这也只是读写的锁定。跟线程安全其实还是差一些。看下面。

     @interface MONPerson : NSObject 
    @property (copy) NSString * firstName; 
    @property (copy) NSString * lastName; 
    - (NSString *)fullName; 
    @end
    
    Thread A:
    p.firstName = @"Rob";
    Thread B:
    p.firstName = @"Robert";
    Thread A:
    label.string = p.firstName; // << uh, oh -- will be Robert

    但是如果有个C也在写,D在读取,D会读到一些随机的值(ABC修改的值),这就不是线程安全的了。最好的方法是使用lock。

    Thread A:
    [p lock]; // << wait for it… … … …
    // Thread B now cannot access 
    pp.firstName = @"Rob";
    NSString fullName = p.fullName;
    [p unlock];
    // Thread B can now access plabel.string = fullName;
    
    Thread B:
    [p lock]; // << wait for it… … … …
    // Thread A now cannot access p…
    [p unlock];

    atomic有个很大的问题是很慢,要比nonatomic慢20倍。
    当然最后建议这种数值数值变化可以让服务器来做。



    文/natewang(简书作者)
    原文链接:http://www.jianshu.com/p/c40b312153c1
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    POJ-1700 Crossing River
    C++操作符new-动态存储空间分配
    POJ-3978-Primes
    POJ-1316-Self Numbers
    浅谈二维数组在传参中的使用
    OneToMany与ManyToOne的属性
    jquery的学习
    struts2常用标签
    Struts2.xml中result type属性说明
    监听器Listener
  • 原文地址:https://www.cnblogs.com/lihaibo-Leao/p/5551247.html
Copyright © 2011-2022 走看看