iOS atomic 與 nonatomic

摘抄蘋果官方文檔為

Atomic is the default: if you don’t type anything, your property is atomic. An atomic property is guaranteed that if you try to read from it, you will get back a valid value. It does not make any guarantees about what that value might be, but you will get back good data, not just junk memory. What this allows you to do is if you have multiple threads or multiple processes pointing at a single variable, one thread can read and another thread can write. If they hit at the same time, the reader thread is guaranteed to get one of the two values: either before the change or after the change. What atomic does not give you is any sort of guarantee about which of those values you might get. Atomic is really commonly confused with being thread-safe, and that is not correct. You need to guarantee your thread safety other ways. However, atomic will guarantee that if you try to read, you get back some kind of value.

nonatomic
On the flip side, non-atomic, as you can probably guess, just means, “don’t do that atomic stuff.” What you lose is that guarantee that you always get back something. If you try to read in the middle of a write, you could get back garbage data. But, on the other hand, you go a little bit faster. Because atomic properties have to do some magic to guarantee that you will get back a value, they are a bit slower. If it is a property that you are accessing a lot, you may want to drop down to nonatomic to make sure that you are not incurring that speed penalty.

設(shè)置成員變量的@property屬性時(shí)派撕,默認(rèn)為atomic蚁孔,提供多線程安全。
在多線程環(huán)境下碾阁,原子操作是必要的,否則有可能引起錯(cuò)誤的結(jié)果些楣。加了atomic脂凶,setter函數(shù)會(huì)變成下面這樣:

{lock}
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}

也就說使用了atomic屬性內(nèi)部會(huì)通過加鎖的機(jī)制來確保其get/set操作的準(zhǔn)確性,防止在寫為完成的時(shí)候被另一個(gè)線程讀取愁茁,造成數(shù)據(jù)錯(cuò)誤蚕钦,缺點(diǎn)也是明顯的在ios中加鎖是一個(gè)很消耗系統(tǒng)資源的操作。

所以我們使用的屬性大部分為nonatomic鹅很,原因就是使用atomic開銷比較大嘶居,帶來性能問題,而且使用atomic也不能保證對象多線程的安全促煮,它只是只能保證你訪問的時(shí)候給你返回一個(gè)完好無損的值而已邮屁。

例如:假設(shè)有一個(gè) atomic 的屬性 "name",如果線程 A 調(diào)[self setName:@"A"]菠齿,線程 B 調(diào)[self setName:@"B"]佑吝,線程 C 調(diào)[self name],那么所有這些不同線程上的操作都將依次順序執(zhí)行——也就是說绳匀,如果一個(gè)線程正在執(zhí)行 getter/setter芋忿,其他線程就得等待炸客。因此,屬性 name 是讀/寫安全的戈钢。

但是痹仙,如果有另一個(gè)線程 D 同時(shí)在調(diào)[name release],那可能就會(huì)crash逆趣,因?yàn)?release 不受 getter/setter 操作的限制蝶溶。也就是說,這個(gè)屬性只能說是讀/寫安全的宣渗,但并不是線程安全的抖所,因?yàn)閯e的線程還能進(jìn)行讀寫之外的其他操作。線程安全需要開發(fā)者自己來保證痕囱。

如果 name 屬性是 nonatomic 的田轧,那么上面例子里的所有線程 A、B鞍恢、C傻粘、D 都可以同時(shí)執(zhí)行,可能導(dǎo)致無法預(yù)料的結(jié)果帮掉。如果是 atomic 的弦悉,那么 A、B蟆炊、C 會(huì)串行稽莉,而 D 還是并行的。

我們可以認(rèn)為atomic只對一個(gè)屬性的getter/setter是安全的涩搓,其它的線程安全是無法保證的污秆。

現(xiàn)在總結(jié)一下nonatomic與atomic的區(qū)別:
atomic:
系統(tǒng)默認(rèn)
會(huì)保證 CPU 能在別的線程來訪問這個(gè)屬性之前,先執(zhí)行完當(dāng)前流程
性能低昧甘,速度慢

atomic 對象的getter/setter方法實(shí)現(xiàn):

  • (void)setCurrentImage:(UIImage *)currentImage
    {
    @synchronized(self) {
    if (_currentImage != currentImage) {
    [_currentImage release];
    _currentImage = [currentImage retain];

      }
    

    }
    }

  • (UIImage *)currentImage
    {
    @synchronized(self) {
    return _currentImage;
    }
    }
    nonatomic:
    不是默認(rèn)的
    速度快
    線程不安全的
    nonatomic 對象的getter/setter方法實(shí)現(xiàn):

  • (void)setCurrentImage:(UIImage *)currentImage
    {
    if (_currentImage != currentImage) {
    [_currentImage release];
    _currentImage = [currentImage retain];

    }
    }

  • (UIImage *)currentImage
    {
    return _currentImage;
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末良拼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子充边,更是在濱河造成了極大的恐慌庸推,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痛黎,死亡現(xiàn)場離奇詭異予弧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)湖饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門掖蛤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人井厌,你說我怎么就攤上這事蚓庭≈录ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵器赞,是天一觀的道長垢袱。 經(jīng)常有香客問我,道長港柜,這世上最難降的妖魔是什么请契? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮夏醉,結(jié)果婚禮上爽锥,老公的妹妹穿的比我還像新娘。我一直安慰自己畔柔,他們只是感情好氯夷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靶擦,像睡著了一般腮考。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玄捕,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天踩蔚,我揣著相機(jī)與錄音,去河邊找鬼枚粘。 笑死寂纪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赌结。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼孝冒,長吁一口氣:“原來是場噩夢啊……” “哼柬姚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庄涡,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤量承,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后穴店,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撕捍,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年泣洞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忧风。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡球凰,死狀恐怖狮腿,靈堂內(nèi)的尸體忽然破棺而出腿宰,到底是詐尸還是另有隱情,我是刑警寧澤缘厢,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布吃度,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜连霉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一散庶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧薯演,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽税灌。三九已至均函,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菱涤,已是汗流浹背苞也。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粘秆,地道東北人如迟。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像攻走,于是被迫代替她去往敵國和親殷勘。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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