概念
關(guān)于nonatomic
和atomic
我相信很多人都了解相關(guān)的作用,按照字面上理解杨凑,nonatomic
是非原子操作欺嗤,atomic
是原子操作覆醇,也可以理解為nonatomic
是線程不安全的赴涵,atomic
是線程安全的货葬。
atomic
和nonatomic
區(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
是不夠的柠并,還需要更完善的防止手法