閱讀原文地址http://www.cnblogs.com/wendingding/p/3805841.html
今天遇到這個問題,看了一下這篇文章,然後按照自己的理解記錄一下,不是很準確,僅供參考.
多線程存在安全隱患,當多線程訪問同一塊資源時,很容易引發數據錯亂和數據安全問題.會對數據進行多次重複處理,線程之間單獨完成處理後返回結果,未進行線程間協同處理數據,造成單條數據被多次處理,造成數據混亂.
通過@synchronized(鎖對象){//需要鎖定的代碼}互斥鎖解決問題, 注意:鎖一份代碼只用一把鎖,用多把鎖是無效的.
互斥鎖的優缺點
優點: 能有效防止因多線程搶奪資源造成的數據安全問題
缺點: 需要消耗大量的CPU資源
互斥鎖的使用前提: 多條線程搶奪同一塊資源
相關專業術語: 線程同步,多條線程按順序地執行任務
互斥鎖, 就是使用了線程同步技術
原子性和非原子性
OC在定義屬性時有nonatomic和atomic兩種
atomic: 原子性,爲setter方法加鎖(默認就是atomic)
nonatomic: 非原子性,不會爲setter方法加鎖
atomic加鎖原理
@property (assign, atomic) int age;
- (void)setAge:(int)age{
@synchronized(self){
_age = age;
}
}
原子性和非原子性的選擇
nonatomic和atomic對比
atomic: 線程安全,需要消耗大量的資源
nonatomic: 非線程安全,適合內存小的移動設備
iOS開發的建議
所有屬性都聲明爲nonatomic
儘量避免多線程搶奪同一塊資源
儘量將加鎖、資源搶奪的業務邏輯交給服務端處理,減小移動客戶端的壓力
還有一篇文章比較清晰的介紹http://blog.csdn.net/horkychen/article/details/8134917