@synchronized 指令

@synchronized 指令能夠方便的在oc代碼中建立互斥鎖。這個指令和其餘的互斥鎖作的同樣,防止同一時間不一樣的線程獲取同一個互斥鎖。在這種狀況下,你沒必要建立互斥或鎖對象,相反,你只須要使用一個oc對象做爲鎖的token,以下所示:html

- (void)myMethod:(id)anObj
{
    @synchronized(anObj)
    {
        // Everything between the braces is protected by the @synchronized directive.
    }
}

傳遞給@synchronized的對象是做爲區分保護塊的一個特別的標識。若是你在兩個不一樣的線程中執行上面的方法,每一個線程傳遞不一樣的對象做爲anObj參數,每一個都會被鎖定並繼續處理而不會被另外的一個阻塞。若是在這兩個線程中傳遞的是同一個對象,其中一個線程會首先獲取鎖,另一個線程被阻塞直到第一個線程的關鍵段完成。ios

做爲預防措施,@synchronized塊隱式地將一個異常處理程序添加到受保護的代碼。這個處理程序自動釋放互斥鎖時,就會拋出一個異常。這意味着爲了使用@synchronized指令,您必須啓用Objective-C代碼中的異常處理。若是你不但願因爲隱式的異常處理形成額外的開銷,您應該考慮使用lock類。關於@ synchronized指令的更多信息,請參見 The Objective-C Programming Language.app

官方文檔測試

啓用oc異常(關閉試了下,編譯運行都沒問題,待跟蹤)
spa

 

 

 

 

 

注:經代碼測試,對於可變對象,若是地址不變的話,仍是互斥的。.net

相關文章
相關標籤/搜索