【iOS筆記 #4】Atomic & 自旋鎖

  • 自旋鎖 不一樣於互斥鎖 若是訪問的資源被佔用,它會處於 忙等 狀態。自旋鎖因爲一直處於忙等狀態因此他在線程鎖被釋放的時候會當即獲取而不用喚醒,因此其執行效率是很高的,尤爲是在多核的cpu上運行效率很高,可是其忙等的狀態會消耗cpu的性能,因此其性能比互斥鎖要低不少。
  • atomic 的底層實現,老版本是自旋鎖,新版本是互斥鎖
  • atomic 並非絕對線程安全,它能保證代碼進入 gettersetter 方法的時候是安全的,可是並不能保證多線程的訪問狀況下是安全的,一旦出了 gettersetter 方法,其線程安全就要由程序員本身來把握,因此 atomic 屬性和線程安全並無必然聯繫。
@property (atomic, assign) NSInteger number;  
  
- (void)atomicTest {  
    dispatch_async(dispatch_get_global_queue(0, 0), ^{  
        for (int i = 0; i < 10000; i ++) {  
            self.number = self.number + 1;  
            NSLog(@"A-self.number is %ld",self.number);  
        }  
    });  
  
    dispatch_async(dispatch_get_global_queue(0, 0), ^{  
        for (int i = 0; i < 10000; i ++) {  
            self.number = self.number + 1;  
            NSLog(@"B-self.number is %ld",self.number);  
        }  
    });  
}

咱們的 numberatomic 進行加鎖了啊,爲何還會出現線程安全問題。其實答案上文已經有了,只是須要咱們仔細去品,atomic 只是針對 settergetter 方法進行加鎖,上述代碼有兩個異步線程同時執行,若是某個時間 A線程 執行到getter方法,以後 cpu 當即切換到 線程B 去執行他的get方法那麼這個時候他們進行 +1 的處理並執行setter方法,那麼兩個線程的 number 就會是同樣的結果,這樣咱們的 +1就會出現線程安全問題,就會致使咱們的數字出現誤差程序員

連接安全

相關文章
相關標籤/搜索