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

來源:互聯網
上載者:User

標籤:

摘要atomic和nonatomic區別用來決定編譯器產生的getter和setter是否為原子操 作。atomic提供多安全執行緒,是描述該變數是否支援多線程的同步訪問,如果選擇了atomic 那麼就是說,系統會自動的建立lock鎖,鎖定變數。nonatomic禁止多線程,變數保護,提高效能。
    • atomic:預設是有該屬性的,這個屬性是為了保證程式在多線程情況下,編譯器會自動產生一些互斥加鎖代碼,避免該變數的讀寫不同步問題。
      nonatomic:如果該對象無需考慮多線程的情況,請加入這個屬性,這樣會讓編譯器少產生一些互斥加鎖代碼,可以提高效率。

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

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

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

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

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.