atomic 和 nonatomic 有什麼區別

2021-07-29 18:09:22 字數 934 閱讀 3195

atomic 和 nonatomic 的區別在於,系統自動生成的 getter/setter 方法不一樣。

atomic:變數預設是有該有屬性的,這個屬性是為了保證在多執行緒的情況下,編譯器會自動生成一些互斥加鎖的**,避免該變數的讀寫不同步的問題。  

nonatomic:如果該物件無需考慮多執行緒的情況,這個屬性會讓編譯器少生成一些互斥**,可以提高效率。

atomic 的意思是setter/getter 這個函式,是乙個原語操作,如果有多個執行緒同時呼叫setter的話,不會出現某乙個執行緒執行完setter全部語句之前,另乙個執行緒開始執行setter情況,相當於函式頭尾加了鎖一樣,可以保證資料的完整性。nonatamic 不保證setter/getter 的原語行,所以你可能會取到不完整的東西。因此,在多執行緒的環境下的原子操作是非常必要的,狗有可能會引起錯誤的結果。

比如setter函式裡改變了兩個成員變數,如果你用nonatomic的話,getter 可能會取到只更改了其中乙個變數時候的狀態,這樣取到的東西會有問題,就是不完整的。當然如果不需要多執行緒支援的話,用nonatomic就夠了,因為不涉及到執行緒鎖的操作,所以它執行效率相對快些。

例如加了atomic的例子:

@property (atomic) uitextfield *namefield;

- (uitextfield *) namefield

return retval;

} - (void) setnamefield:(uitextfield *)newvalue

} 所以,atomic 會在多執行緒設值取值的時候加鎖,中間的執行層是處於被保護的一種狀態,atomic 是oc使用的一種執行緒保護技術,基本上講,就是防止在寫入未完成的時候被另外乙個執行緒讀取,造成資料錯誤。而這種機制是耗費系統資源的,所以在iphone這種小型裝置上,如果沒有使用多執行緒間的通訊程式設計,那麼nonatomic是乙個非常好的選擇!

atomic 和 nonatomic的區別

原子性和非原子性的區別 兩個關鍵字修飾的oc物件,系統都會自動生成setter getter方法,區別就在於乙個會進行加鎖操作,乙個不會。系統預設是使用atomic的。因為atomic做了執行緒鎖,所以理論上講atomic是要比nonatomic更加耗費效能,更慢。理論上如果沒有特殊要求的話,ios...

atomic 加鎖操作

property atomic,strong nsstring name setter void setname name getter void name 為什麼加鎖 多執行緒的安全隱患 資源共享 一塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源 比如多個執行緒訪問同乙個物件 ...

原子操作 atomic

所謂的原子操作,取的就是 原子是最小的 不可分割的最小個體 的意義,它表示在多個執行緒訪問同乙個全域性資源的時候,能夠確保所有其他的執行緒都不在同一時間內訪問相同的資源。也就是他確保了在同一時刻只有唯一的執行緒對這個資源進行訪問。這有點類似互斥物件對共享資源的訪問的保護,但是原子操作更加接近底層,因...