nonatomic 與 atomic 的故事

概念

關(guān)于nonatomicatomic我相信很多人都了解相關(guān)的作用,按照字面上理解杨凑,nonatomic是非原子操作欺嗤,atomic是原子操作覆醇,也可以理解為nonatomic線程不安全的赴涵,atomic線程安全的货葬。

atomicnonatomic區(qū)別用來決定編譯器生成的getter和setter是否為原子操作。

  • atomic 默認(rèn)是有該屬性的,這個(gè)屬性是為了保證程序在多線程情況下起宽,編譯器會(huì)自動(dòng)生成一些互斥加鎖代碼,避免該變量的讀寫不同步問題济榨。
  • nonatomic 如果該對(duì)象無需考慮多線程的情況坯沪,請(qǐng)加入這個(gè)屬性,這樣會(huì)讓編譯器少生成一些互斥加鎖代碼擒滑,不用耗費(fèi)系統(tǒng)資源腐晾,可以提高效率。

atomic

atomic的意思就是setter/getter這個(gè)函數(shù)橘忱,是一個(gè)原語操作赴魁。如果有多個(gè)線程同時(shí)調(diào)用setter的話,不會(huì)出現(xiàn)某一個(gè)線程執(zhí)行完setter全部語句之前钝诚,另一個(gè)線程開始執(zhí)行setter情況颖御,相當(dāng)于函數(shù)頭尾加了鎖一樣,可以保證數(shù)據(jù)的完整性凝颇。

看以下邏輯代碼為例:

{lock}                                

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

可以看出來潘拱,用atomic會(huì)在多線程的設(shè)值取值時(shí)加鎖,中間的執(zhí)行層是處于被保護(hù)的一種狀態(tài)拧略,atomic是Objective-C使用的一種線程保護(hù)技術(shù)芦岂,基本上來講,就是防止在寫入未完成的時(shí)候被另外一個(gè)線程讀取垫蛆,造成數(shù)據(jù)錯(cuò)誤禽最。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上袱饭,如果沒有使用多線程間的通訊編程川无,那么nonatomic是一個(gè)非常好的選擇。所以一般iOS程序中虑乖,所有屬性都聲明為nonatomic懦趋。這樣做的原因是:在iOS中使用同步鎖的開銷比較大, 這會(huì)帶來性能問題疹味。一般情況下并不要求屬性必須是“原子的”仅叫,因?yàn)檫@并不能保證“線程安全”(thread safety),若要實(shí)現(xiàn)“線程安全”的操作糙捺,還需采用更為深層的鎖定機(jī)制才行诫咱。

例如:一個(gè)線程在連續(xù)多次讀取某個(gè)屬性值的過程中有別的線程在同時(shí)改寫該值,那么即便將屬性聲明為atomic洪灯,也還是會(huì)讀取到不同的屬性值坎缭。

注意:atomic是直接從寄存器上拿數(shù)據(jù),而nonatomic是從內(nèi)存拿數(shù)據(jù)


nonatomic

關(guān)于nonatomic是線程不安全的,當(dāng)有多個(gè)線程同時(shí)修改屬性name的值的時(shí)候幻锁,拿到的結(jié)果可能不是自己想要的,因?yàn)楫?dāng)屬性設(shè)置nonatomic的話是允許多個(gè)線程是可以同時(shí)修改name的值边臼。


總結(jié)

簡(jiǎn)單來說atomic是串行哄尔,nonatomic是并行,但如果要真正實(shí)現(xiàn)防止多線程修改某屬性的值的時(shí)候,單單設(shè)置atomic是不夠的柠并,還需要更完善的防止手法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岭接,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子臼予,更是在濱河造成了極大的恐慌鸣戴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粘拾,死亡現(xiàn)場(chǎng)離奇詭異窄锅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缰雇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門入偷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人械哟,你說我怎么就攤上這事疏之。” “怎么了暇咆?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵锋爪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我爸业,道長(zhǎng)其骄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任沃呢,我火速辦了婚禮年栓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薄霜。我一直安慰自己某抓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布惰瓜。 她就那樣靜靜地躺著否副,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崎坊。 梳的紋絲不亂的頭發(fā)上备禀,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼曲尸。 笑死赋续,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的另患。 我是一名探鬼主播纽乱,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昆箕!你這毒婦竟也來了鸦列?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤鹏倘,失蹤者是張志新(化名)和其女友劉穎薯嗤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纤泵,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骆姐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捏题。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诲锹。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涉馅,靈堂內(nèi)的尸體忽然破棺而出归园,到底是詐尸還是另有隱情,我是刑警寧澤稚矿,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布庸诱,位于F島的核電站,受9級(jí)特大地震影響晤揣,放射性物質(zhì)發(fā)生泄漏桥爽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一昧识、第九天 我趴在偏房一處隱蔽的房頂上張望钠四。 院中可真熱鬧,春花似錦跪楞、人聲如沸缀去。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缕碎。三九已至,卻和暖如春池户,著一層夾襖步出監(jiān)牢的瞬間咏雌,已是汗流浹背凡怎。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赊抖,地道東北人统倒。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氛雪,于是被迫代替她去往敵國(guó)和親檐薯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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