轉載請標明出處: http://blog.csdn.net/zhangxingping
線程
Objective-C除了提供異常處理機制外,還提供了線程同步功能。異常處理在前面的“異常處理”章節有介紹。
線程的同步執行
Objective-C支援程式中的多線程。這就意味著兩個線程有可能同時修改同一個對象,這將在程式中導致嚴重的問題。為了避免這種多個線程同時執行同一段代碼的情況,Objective-C提供了@synchronized()指令。
指令@synchronized()通過對一段代碼的使用進行加鎖。其他試圖執行該段代碼的線程都會被阻塞,直到加鎖線程退出執行該段被保護的程式碼片段,也就是說@synchronized()代碼塊中的最後一條語句已經被執行完畢的時候。
指令@synchronized()需要一個參數。該參數可以使任何的Objective-C對象,包括self。這個對象就是互斥訊號量。他能夠讓一個線程對一段代碼進行保護,避免別的線程執行該段代碼。針對程式中的不同的關鍵程式碼片段,我們應該分別使用不同的訊號量。只有在應用程式編程執行多線程之前就建立好所有需要的互斥訊號量對象來避免線程間的競爭才是最安全的。
列表12-1的代碼中使用self作為互斥訊號量來實現當前對象對執行個體方法訪問的同步。
-(void)criticalMethod{ @synchronized(self) { //關鍵代碼; }}
列表12-2 使用自訂的訊號量來對方法加鎖
Account *account = [AccountaccoutFromString :[accountFiled stringValue]]; //擷取訊號量id accountSemaphore = [Account semaphore];@synchronized(accountSemaphore){ //關鍵代碼}
Objective-C中的同步特性是支援遞迴的。一個線程是可以以遞迴的方式多次使用同一個訊號量的;其他的線程會被阻塞知道這個線程釋放了自己所有的和該訊號量相關的鎖,也就是說通過正常執行或者是通過異常處理的方式退出了所有的@synchronized()代碼塊。
當在@synchronized()代碼塊中拋出異常的時候, Objective-C運行時會捕獲到該異常,並釋放訊號量,並把該異常重新拋出給下一個異常處理者。