天天看點

iOS開發多線程篇—線程安全

一、多線程的安全隐患

資源共享

1塊資源可能會被多個線程共享,也就是多個線程可能會通路同一塊資源

比如多個線程通路同一個對象、同一個變量、同一個檔案

當多個線程通路同一塊資源時,很容易引發資料錯亂和資料安全問題

示例一:

iOS開發多線程篇—線程安全

示例二:

iOS開發多線程篇—線程安全

問題代碼:

iOS開發多線程篇—線程安全
iOS開發多線程篇—線程安全

列印結果:

iOS開發多線程篇—線程安全

二、安全隐患分析

iOS開發多線程篇—線程安全
iOS開發多線程篇—線程安全

三、如何解決

互斥鎖使用格式

@synchronized(鎖對象) { // 需要鎖定的代碼 }

注意:鎖定1份代碼隻用1把鎖,用多把鎖是無效的

代碼示例:

iOS開發多線程篇—線程安全
iOS開發多線程篇—線程安全

執行效果圖

iOS開發多線程篇—線程安全

互斥鎖的優缺點

優點:能有效防止因多線程搶奪資源造成的資料安全問題

缺點:需要消耗大量的cpu資源

互斥鎖的使用前提:多條線程搶奪同一塊資源

相關專業術語:線程同步,多條線程按順序地執行任務

互斥鎖,就是使用了線程同步技術

四:原子和非原子屬性

oc在定義屬性時有nonatomic和atomic兩種選擇

atomic:原子屬性,為setter方法加鎖(預設就是atomic)

nonatomic:非原子屬性,不會為setter方法加鎖

atomic加鎖原理

iOS開發多線程篇—線程安全
iOS開發多線程篇—線程安全

原子和非原子屬性的選擇

nonatomic和atomic對比

atomic:線程安全,需要消耗大量的資源

nonatomic:非線程安全,适合記憶體小的移動裝置

ios開發的建議

所有屬性都聲明為nonatomic

盡量避免多線程搶奪同一塊資源

盡量将加鎖、資源搶奪的業務邏輯交給伺服器端處理,減小移動用戶端的壓力

繼續閱讀