一、多線程的安全隐患
資源共享
1塊資源可能會被多個線程共享,也就是多個線程可能會通路同一塊資源
比如多個線程通路同一個對象、同一個變量、同一個檔案
當多個線程通路同一塊資源時,很容易引發資料錯亂和資料安全問題
示例一:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CM1UTN2kDM3ITN1ITM0IzLcZDM0EDMy8CX2MTMwUDNvwVavwVbvNmLn9GbiRXauNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.png)
示例二:
問題代碼:
列印結果:
二、安全隐患分析
三、如何解決
互斥鎖使用格式
@synchronized(鎖對象) { // 需要鎖定的代碼 }
注意:鎖定1份代碼隻用1把鎖,用多把鎖是無效的
代碼示例:
執行效果圖
互斥鎖的優缺點
優點:能有效防止因多線程搶奪資源造成的資料安全問題
缺點:需要消耗大量的cpu資源
互斥鎖的使用前提:多條線程搶奪同一塊資源
相關專業術語:線程同步,多條線程按順序地執行任務
互斥鎖,就是使用了線程同步技術
四:原子和非原子屬性
oc在定義屬性時有nonatomic和atomic兩種選擇
atomic:原子屬性,為setter方法加鎖(預設就是atomic)
nonatomic:非原子屬性,不會為setter方法加鎖
atomic加鎖原理
原子和非原子屬性的選擇
nonatomic和atomic對比
atomic:線程安全,需要消耗大量的資源
nonatomic:非線程安全,适合記憶體小的移動裝置
ios開發的建議
所有屬性都聲明為nonatomic
盡量避免多線程搶奪同一塊資源
盡量将加鎖、資源搶奪的業務邏輯交給伺服器端處理,減小移動用戶端的壓力