使用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
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM