當(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上性能不是瓶頸,所以就不用了。