這個(gè)問(wèn)題很少遇到,但是答案當(dāng)然不是省容。
atomic在set方法里加了鎖抖拴,防止了多線程一直去寫(xiě)這個(gè)property,造成難以預(yù)計(jì)的數(shù)值腥椒。但這也只是讀寫(xiě)的鎖定阿宅。跟線程安全其實(shí)還是差一些×耄看下面洒放。
@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
但是如果有個(gè)C也在寫(xiě),D在讀取滨砍,D會(huì)讀到一些隨機(jī)的值(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有個(gè)很大的問(wèn)題是很慢煌茴,要比nonatomic慢20倍。
當(dāng)然最后建議這種數(shù)值數(shù)值變化可以讓服務(wù)器來(lái)做日川。
我們可以將多線程不安全解釋為:多線程訪問(wèn)時(shí)出現(xiàn)意料之外的結(jié)果蔓腐。這個(gè)意料之外的結(jié)果包含幾種場(chǎng)景,不一定是指crash龄句。
atomic可以保證setter和getter存取的線程安全回论,不會(huì)讓你拿到一個(gè)崩潰的值,但是這個(gè)對(duì)象就不是線程安全的分歇。