同步 Synchronization 的問題通常發生在多執行緒 Thread 或是行程 Process 這種資源需要彼此競爭方面,假使有 N 個執行緒同時在執行,若是其中一個執行緒佔用一項共用資源,那麼此資源就必須與其他的執行緒保持互斥的狀態,防止資源被其它的執行緒存取變更,因而導致原執行緒出現計算錯誤等情形,在解決同步的問題的演算法上大家可以參考 Semaphores、Spinlock 或是 Monitors,這裡就不多做贅述。
在 Objective-C 裡可以透過 @synchronized 來實做類似於上述的這些演算法,使共享資源在多執行緒 Multiple Threads 下依然可以保持同步,下列是 iOS Developer Library 官方文件對這個方法的解釋。
- (void)myMethod:(id)anObj {
@synchronized(anObj) {
// Everything between the braces is protected by the @synchronized directive.
}
}
舉個簡單的例子,假設我們有一個 Singleton 物件,他在整個程式中只會存在一個 Instance,因此所有的執行緒在需要此資源時都會來存取這個單一的物件,為了維持此 Singleton 物件在同一時間只能被一個執行緒進行情取,就可以使用下面程式碼來實現。
- (void)SingletonObjectMethod {
//判斷物件是否處於可用(互斥)狀態
@synchronized([SingletonObject class]) {
//在此就可以對SingletonObject物件進行安全存取的動作
}
}
最後,在文件中也提供其他許多 Lock 的方式來解決同步的問題,有興趣的朋友可以自行研究看看。
沒有留言:
張貼留言