objective-c @synchronized 鎖用法
Objective-C除了提供異常處理機(jī)制外孩擂,還提供了線程同步功能概行。異常處理在前面的“異常處理”章節(jié)有介紹链快。
Objective-C支持程序中的多線程轰枝。這就意味著兩個線程有可能同時修改同一個對象拧簸,這將在程序中導(dǎo)致嚴(yán)重的問題拾酝。為了避免這種多個線程同時執(zhí)行同一段代碼的情況燕少,Objective-C提供了@synchronized()指令。
指令@synchronized()通過對一段代碼的使用進(jìn)行加鎖蒿囤。其他試圖執(zhí)行該段代碼的線程都會被阻塞客们,直到加鎖線程退出執(zhí)行該段被保護(hù)的代碼段,也就是說@synchronized()代碼塊中的最后一條語句已經(jīng)被執(zhí)行完畢的時候。
指令@synchronized()需要一個參數(shù)底挫。該參數(shù)可以使任何的Objective-C對象恒傻,包括self。這個對象就是互斥信號量建邓。他能夠讓一個線程對一段代碼進(jìn)行保護(hù)盈厘,避免別的線程執(zhí)行該段代碼。針對程序中的不同的關(guān)鍵代碼段官边,我們應(yīng)該分別使用不同的信號量沸手。只有在應(yīng)用程序編程執(zhí)行多線程之前就創(chuàng)建好所有需要的互斥信號量對象來避免線程間的競爭才是最安全的。
Objective-C中的同步特性是支持遞歸的注簿。一個線程是可以以遞歸的方式多次使用同一個信號量的契吉;其他的線程會被阻塞知道這個線程釋放了自己所有的和該信號量相關(guān)的鎖,也就是說通過正常執(zhí)行或者是通過異常處理的方式退出了所有的@synchronized()代碼塊诡渴。
當(dāng)在@synchronized()代碼塊中拋出異常的時候捐晶, Objective-C運行時會捕獲到該異常,并釋放信號量妄辩,并把該異常重新拋出給下一個異常處理者惑灵。