這個問題很少遇到,但是答案當然不是。
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
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
原文鏈接:http://www.jianshu.com/p/c40b312153c1
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。