atomic 和 nonatomic的區別

2021-09-01 22:57:44 字數 1056 閱讀 9358

原子性和非原子性的區別

兩個關鍵字修飾的oc物件,系統都會自動生成setter/getter方法,區別就在於乙個會進行加鎖操作,乙個不會。系統預設是使用atomic的。

因為atomic做了執行緒鎖,所以理論上講atomic是要比nonatomic更加耗費效能,更慢。理論上如果沒有特殊要求的話,ios用nonatomic比較好,而osx用atomic比較好。如果不寫,系統按照相對比較安全的atomic處理。ios用nonatomic主要是出於效能考慮,osx上效能不是瓶頸,所以就不用了。

atomic系統會在生成的setter/getter方法裡加鎖,但是這個鎖僅僅是保證了setter/getter訪問的安全,並不能保證資料結果正確。

例如:a執行緒執行setter方法到一半的時候,b執行緒執行getter方法,那麼b執行緒執行getter方法,那麼b執行緒的getter方法會被阻塞,等到setter方法執行完成之後才能取到值。這裡系統使用的也是@synchronized.

a,b,c等多個執行緒都要操作同乙個物件setter,d執行緒要getter這個物件的值,那麼每一線程都成保證各自資料的完整性,但是d執行緒最後get到的值並不能確定。

以上,所以atomic能夠保證資料的完成性,也就是說他只是讀寫安全,並不能準確定義它是執行緒安全的。因為執行緒可以對資料做很多操作,包括讀寫,還有release,retain,假如說對乙個已經釋放的物件進行release,就會導致crash。

by the way

@synthesize和dynamic的區別

@synthesize var= _var是預設的,如果你沒有手動實現setter/getter方法,那麼編譯器就會自動給你加上這兩個方法

atomic關鍵字實現setter/getter方法如下

@dynamic則是告訴編譯器,使用者自己去實現setter/getter方法,但是如果你這麼申明了,最後卻沒有手動去實現,那麼編譯可能是沒問題的,但是最後程式執行到obj.var = svar的時候,會因為找不到方法而crash.

**:

atomic 和 nonatomic 有什麼區別

atomic 和 nonatomic 的區別在於,系統自動生成的 getter setter 方法不一樣。atomic 變數預設是有該有屬性的,這個屬性是為了保證在多執行緒的情況下,編譯器會自動生成一些互斥加鎖的 避免該變數的讀寫不同步的問題。nonatomic 如果該物件無需考慮多執行緒的情況,這...

atomic 加鎖操作

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

原子操作 atomic

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