多線程的安全隱患
資源共享
1塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問同一塊資源
比如多個(gè)線程訪問同一個(gè)對象、同一個(gè)變量、同一個(gè)文件
當(dāng)多個(gè)線程訪問同一塊資源時(shí),很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問題
如何解決
使用互斥鎖
@synchronized(鎖對象) { // 需要鎖定的代碼? }
被鎖定的代碼在多線程中會(huì)順序執(zhí)行。
互斥鎖的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題
缺點(diǎn):需要消耗大量的CPU資源
互斥鎖的使用前提:多條線程搶奪同一塊資源
相關(guān)專業(yè)術(shù)語:線程同步,多條線程按順序地執(zhí)行任務(wù)
互斥鎖,就是使用了線程同步技術(shù)
使用OC原子性實(shí)現(xiàn)互斥鎖
OC在定義屬性時(shí)有nonatomic和atomic兩種選擇
atomic:原子屬性,為setter方法加鎖(默認(rèn)就是atomic)
nonatomic:非原子屬性,不會(huì)為setter方法加鎖
atomic加鎖原理
@property (assign, atomic) int age;
?- (void)setAge:(int)age
?{ ?
? ? ? ? ? @synchronized(self) {
? ? ? ? ? ? ? ? ? _age = age;
? ? ? ? ? ?}
}