自旋鎖
不一樣於互斥鎖
若是訪問的資源被佔用,它會處於 忙等
狀態。自旋鎖因爲一直處於忙等狀態因此他在線程鎖被釋放的時候會當即獲取而不用喚醒,因此其執行效率是很高的,尤爲是在多核的cpu上運行效率很高,可是其忙等的狀態會消耗cpu
的性能,因此其性能比互斥鎖要低不少。atomic
的底層實現,老版本是自旋鎖
,新版本是互斥鎖
。atomic
並非絕對線程安全,它能保證代碼進入 getter
和 setter
方法的時候是安全的,可是並不能保證多線程的訪問狀況下是安全的,一旦出了 getter
和 setter
方法,其線程安全就要由程序員本身來把握,因此 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); } }); }
咱們的 number
是 atomic
進行加鎖了啊,爲何還會出現線程安全問題。其實答案上文已經有了,只是須要咱們仔細去品,atomic
只是針對 setter
和 getter
方法進行加鎖,上述代碼有兩個異步線程同時執行,若是某個時間 A線程
執行到getter
方法,以後 cpu
當即切換到 線程B
去執行他的get方法那麼這個時候他們進行 +1
的處理並執行setter
方法,那麼兩個線程的 number
就會是同樣的結果,這樣咱們的 +1
就會出現線程安全問題,就會致使咱們的數字出現誤差程序員
連接安全