爲何使用線程同步技術:多個線程是同時執行的 若是多個線程同時操做一個資源 會形成此資源的數據錯亂安全
線程同步簡介多線程
線程同步,多條線程按順序地訪問某個資源atom
注意:此處的同步不是一塊兒執行的意思 是一個一個按照順序執行 一個執行完了 另外一個才能執行spa
場景:線程
當多個線程同時訪問一個資源的時候 會形成該資源的混亂 此時應使用線程同步code
資源:Toilet男女共用對象
線程:peopleA、peopleB(女)、peopleCblog
互斥鎖,就是線程同步技術的體現資源
場景: 兩個售票員售票同步
兩個線程 名字分別是 售票員A、售票員B
一樣的工做賣票:
一、先獲取票數 int count = self.ticketsCount
二、判斷票是否賣完了 if(count>0)
三、暫停一會分線程 0.002 (保證兩個都獲取到了總票數 模擬理論上的狀況)
四、票數等於檢查票數減一 self.ticketsCount = count-1
五、獲取當前線程
六、打印當前線程、以及剩餘票數
iOS應用程序中支持多任務。這意味着可能有兩個線程同時試圖修改同一個對象。有一個辦法能夠解決這個狀況。爲了防止多個線程同時執行同一個代碼塊,OC提供了@synchronized()指令。
使用@synchronized()指令能夠鎖住在線程中執行的某一個代碼塊。使用代碼塊的其餘線程,將被阻塞,這也就意味着,他們將在@synchronized()代碼塊的最後一條語句執行結束後才能繼續執行。
通常在操做公用資源的時候使用,如單例模式或者操做類的static變量中使用。
@synchronized(對象A){須要線程同步的代碼}
對象A是一個用來區別保護塊的惟一標識符 其實就是至關於一把鎖
以下所示 若是不一樣線程傳遞不一樣的對象 那麼將不會起到線程同步的做用
一般都在此處傳self @「123」 @「456」 id 任意對象類型 等價於 NSObject *
反例
- (void)myMethod:(id)anyObject { @synchronized(anyObject){ } }
互斥鎖的優缺點 NSLock
優勢:能有效防止因多線程搶奪資源形成的數據安全問題
缺點:須要消耗大量的CPU資源
補充知識:
OC在定義屬性時有nonatomic和atomic兩種選擇
atomic:默認的property關鍵字,原子屬性,爲set方法加鎖 線程安全(默認就是atomic)
nonatomic:非原子屬性,不會爲setter方法加鎖 非線程安全
atomic加鎖原理
@property (assign) int age;
- (void)setAge:(int)age
{
@synchronized(self) {
_age = age;
}
}
自動釋放池 NSAutoreleasePool
當你向對象發送一個autorelease消息 該對象會被標記 進入自動釋放池 當自動釋放池釋放時會調用release或drain方法先銷燬池中的對象 而後銷燬本身
推薦:drain
使用場景:
a、線程中使用自動釋放池來包裹代碼
b、局部產生大量autorelease對象 好比線程中的循環中
一、NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release] 或者 [pool drain]
上面二者沒有本質的區別 在GC環境下release無效 建議drain
二、@autorelease{
}