
1. synchronized 這個主要是考慮多線程的程序,這個指令可以將{ } 內的代碼限制在一個線程執行,如果某個線程沒有執行完,其他的線程如果需要執行就得等着。
Objective-C除了提供異常處理機制外,還提供了線程同步功能。異常處理在前面的“異常處理”章節有介紹。
@synchronized 的作用是創建一個互斥鎖,保證此時沒有其它線程對self對象進行修改。這個是objective-c的一個鎖定令牌,防止self對象在同一時間內被其它線程訪問,起到線程的保護作用。 一般在公用變量的時候使用,如單例模式或者操作類的static變量中使用。
1. synchronized 這個主要是考慮多線程的程序,這個指令可以將{ } 內的代碼限制在一個線程執行,如果某個線程沒有執行完,其他的線程如果需要執行就得等着。
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運行時會捕獲到該異常,並釋放信號量,並把該異常重新拋出給下一個異常處理者。
