用atomic一定是執行緒安全的嗎

2021-07-05 20:50:47 字數 1356 閱讀 9666

- (void)setprop:(nsstring *)newvalue

按我理解:

1.此處的執行緒安全是就getter,setter而言的。比如對於@property(nonatomic,copy)nsstring *str; 當呼叫self.str = @"hello,guy";如果是多執行緒,在乙個執行緒執行setter方法的時候,會涉及到字串拷貝,另乙個執行緒去讀取,很可能讀到一半的資料,也就是garbage資料。

2.另外的話,它也僅限於getter,setter時的執行緒安全。比如@property(atomic,strong)nsmutablearray *arr;如果乙個執行緒迴圈讀資料,乙個執行緒迴圈寫資料,肯定會產生記憶體問題。因為它和setter,getter沒有關係。

其次,atomic在set方法裡加了鎖,防止了多執行緒一直去寫這個property,造成難以預計的數值。但這也只是讀寫的鎖定。跟執行緒安全其實還是差一些。看下面。

@inte***ce

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倍。

當然最後建議這種數值數值變化可以讓伺服器來做。

使用atomic一定是執行緒安全的嗎?

這個問題很少遇到,但是答案當然不是。atomic在set方法裡加了鎖,防止了多執行緒一直去寫這個property,造成難以預計的數值。但這也只是讀寫的鎖定。跟執行緒安全其實還是差一些。看下面。inte ce monperson nsobject property copy nsstring firs...

atomic一定執行緒安全嗎

atomic只是保證了操作的原子性,原子操作即乙個操作不可再分。atomic只是對讀寫操作進行了加鎖,保證了多執行緒開發時乙個讀寫操作完成之後才能進行下乙個讀寫操作 atomic和執行緒安全沒有太大的關係,舉例 如果a,b,c都在進行寫的操作,d進行讀操作,d就會讀取到隨機的值 abc不清楚誰修改的...

經驗一定是正確的麼

一轉眼工作已經一年了,算得上有了一點經驗。對我來說,對個人的發展好像到達了乙個坎上,如果能順利邁過這個坎,今後還能快速成長,如果不能今後就庸庸碌碌了。我覺得比較重要的一點是要正確看待目前擁有的經驗。昨天發生一件事情,我在重灌nms驅動的時候,發現ct daemon無法啟動。按照經驗,我花了很長時間重...