atomic與nonatomic使用的誤區(qū)

當(dāng)討論到property多線程安全的時(shí)候,很多人都知道給property加上atomic attribute之后,可以一定程度的保障多線程安全。

但是這個(gè)其實(shí)是存在誤區(qū)的,設(shè)置atomic后,只是默認(rèn)的生成getter和setter方法執(zhí)行是原子的,只能保證多線程中執(zhí)行g(shù)etter和setter方法是線程安全的,但是實(shí)際上很多時(shí)候是執(zhí)行g(shù)etter后需要對變量做處理,這個(gè)時(shí)候就會(huì)出問題。

兩個(gè)線程訪問同一個(gè)atomic修飾的屬性

上面這段代碼就會(huì)出現(xiàn)閃退,因?yàn)閟elf.atomicProperty.length是原子的,這個(gè)時(shí)候如果是@“1234567890”,進(jìn)入到if中后,值可能會(huì)變?yōu)锧“123”,導(dǎo)致閃退。

為了避免上面這種多線程訪問和寫入的問題,如果訪問只是簡單的訪問時(shí),可以用一個(gè)局部變量接收一下,或者通過代碼塊加鎖的方式來避免,如下:

通過局部變量接收
通過加鎖方式

不過由于atomic速度不快,所以如果不會(huì)多線程中操作的話,盡量還是使用nonatomic修飾。


另外之前看到有人問:系統(tǒng)默認(rèn)的是atomic的,為什么大多時(shí)候都是使用nonatomic?

看到有個(gè)大神的解釋是:理論上如果沒有特殊要求的話,iOS用nonatomic比較好,而OSX用atomic比較好。如果不寫的話,系統(tǒng)按照相對比較安全的atomic處理。iOS用nonatomic主要是出于性能考慮,OSX上性能不是瓶頸,所以就不用了。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 兵哥哥說他們那里下雪了,北京什么時(shí)候下雪? 好想和兵哥哥一起看雪,在雪地里 走著、跑著、打鬧著,就這樣一起到白頭…...
    剛剛焦閱讀 228評(píng)論 0 0
  • 它好像是獨(dú)立的,完全不屬于任何人。是一雙沒有魂了的雙手,還是它的魂也隨著雨滴飄散到了什么地方。 沒有任何的知覺...
    誰滄桑了我的人生閱讀 247評(píng)論 0 0
  • 《2017年總結(jié)及2018年展望》 ...
    車柚派閱讀 631評(píng)論 0 0
  • MySQL的時(shí)間類型timestamp提供了幾種設(shè)置默認(rèn)值的方式,合理利用后無需手動(dòng)給他設(shè)置值,可以提高開發(fā)效率,...
    田文健閱讀 5,650評(píng)論 0 0
  • 經(jīng)常有簡友問我這樣的一個(gè)問題,“你的動(dòng)圖是如何制作的?用什么軟件?”。因此,在日常寫作中,亦或是在每個(gè)人都有可能遇...
    傲看今朝閱讀 1,059評(píng)論 3 15