iOS中線程同步基本詳解

爲何使用線程同步技術:多個線程是同時執行的 若是多個線程同時操做一個資源 會形成此資源的數據錯亂安全

 

線程同步簡介多線程

線程同步,多條線程按順序地訪問某個資源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{

     

      }

相關文章
相關標籤/搜索