en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

9.23.2011

使用 @synchronized 解決同步的問題

同步 Synchronization 的問題通常發生在多執行緒 Thread 或是行程 Process 這種資源需要彼此競爭方面,假使有 N 個執行緒同時在執行,若是其中一個執行緒佔用一項共用資源,那麼此資源就必須與其他的執行緒保持互斥的狀態,防止資源被其它的執行緒存取變更,因而導致原執行緒出現計算錯誤等情形,在解決同步的問題的演算法上大家可以參考 SemaphoresSpinlock 或是 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 的方式來解決同步的問題,有興趣的朋友可以自行研究看看。






沒有留言:

張貼留言