iOS開發多線程篇---atomic nonatomic區別



  • atomic:默認是有該屬性的,這個屬性是爲了保證程序在多線程狀況下,編譯器會自動生成一些互斥加鎖代碼,避免該變量的讀寫不一樣步問題。
    nonatomic:若是該對象無需考慮多線程的狀況,請加入這個屬性,這樣會讓編譯器少生成一些互斥加鎖代碼,能夠提升效率。 編程

  • atomic的意思就是setter/getter這個函數,是一個原語操做。若是有多個線程同時調用setter的話,不會出現某一個線程執行完setter所有語句以前,另外一個線程開始執行setter狀況,至關於函數頭尾加了鎖同樣,能夠保證數據的完整性。nonatomic不保證setter/getter的原語行,因此你可能會取到不完整的東西。所以,在多線程的環境下原子操做是很是必要的,不然有可能會引發錯誤的結果。 多線程

  • 好比setter函數裏面改變兩個成員變量,若是你用nonatomic的話,getter可能會取到只更改了其中一個變量時候的狀態,這樣取到的東西會有問題,就是不完整的。固然若是不須要多線程支持的話,用nonatomic就夠了,由於不涉及到線程鎖的操做,因此它執行率相對快些。 函數

  • 下面是載錄的網上一段加了atomic的例子: atom

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

  • 能夠看出來,用atomic會在多線程的設值取值時加鎖,中間的執行層是處於被保護的一種狀態,atomic是oc使用的一種線程保護技術,基本上來說,就是防止在寫入未完成的時候被另一個線程讀取,形成數據錯誤。而這種機制是耗費系統資源的,因此在iPhone這種小型設備上,若是沒有使用多線程間的通信編程,那麼nonatomic是一個很是好的選擇。 線程

相關文章
相關標籤/搜索