原文鏈接 ????相關(guān)鏈接1????相關(guān)鏈接2
【1】多線程安全隱患
1??資源共享
1.一塊資源可能會被多個(gè)線程共享牍颈,也就是多個(gè)線程可能會訪問同一塊資源
2.比如多個(gè)線程訪問同一個(gè)對象歇万、同一個(gè)變量挨稿、同一個(gè)文件
2??當(dāng)多個(gè)線程訪問同一塊資源時(shí)速址,很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問題
【2】多線程安全問題解決
1??互斥鎖使用格式
@synchronized(鎖對象) {//需要鎖定的代碼}
注意:鎖定1份代碼只用1把鎖辕棚,用多把鎖是無效的
2??互斥鎖的優(yōu)缺點(diǎn)
1.優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題
2.缺點(diǎn):需要消耗大量的CPU資源
3.互斥鎖的使用前提:多條線程搶奪同一塊資源
4.相關(guān)專業(yè)術(shù)語:線程同步
①線程同步的意思是:多條線程在同一條線上執(zhí)行(按順序地執(zhí)行任務(wù))
②互斥鎖奴曙,就是使用了線程同步技術(shù)
【3】原子和非原子屬性
OC在定義屬性時(shí)有nonatomic和atomic兩種選擇
1.atomic:原子屬性别凹,為setter方法加鎖(默認(rèn)就是atomic)
2.nonatomic:非原子屬性,不會為setter方法加鎖
【4】原子和非原子屬性的選擇
1??nonatomic和atomic對比
1.atomic:線程安全洽糟,需要消耗大量的資源
2.nonatomic:非線程安全炉菲,適合內(nèi)存小的移動(dòng)設(shè)備
2??iOS開發(fā)的建議
1.所有屬性都聲明為nonatomic
2.盡量避免多線程搶奪同一塊資源
3.盡量將加鎖堕战、資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減小移動(dòng)客戶端的壓力
注意點(diǎn):
注意點(diǎn):atomic系統(tǒng)自動(dòng)給我們添加的鎖不是互斥鎖拍霜,而是 自旋鎖
互斥鎖和自旋鎖共同點(diǎn)
- 都能夠保證多線程在同一時(shí)候, 只能有一個(gè)線程操作鎖定的代碼
互斥鎖和自旋鎖不同點(diǎn)
-如果是互斥鎖,假如現(xiàn)在被鎖住了,那么后面來得線程就會進(jìn)入”休眠”狀態(tài), 直到解鎖之后, 又會喚醒線程繼續(xù)執(zhí)行
-如果是自旋鎖, 假如現(xiàn)在被鎖住了, 那么后面來得線程不會進(jìn)入休眠狀態(tài), 會一直傻傻的等待, 直到解鎖之后立刻執(zhí)行
-自旋鎖更適合做一些較短的操作
atomic 消耗的CPU資源嘱丢,atomic 消耗的CPU資源,atomic 消耗的CPU資源祠饺,重要的事情說三遍